在python中有一个很好的库'base64',该模块可以根据文件名和内容对文件进行编码/解码。我正在开发一个具有上传文件功能的API。我设法编写一些代码来对这些文件进行编码和解码,但通过HTTP请求发送此编码的base64消息的正确方法是什么?什么是通过HTTP通过base64编码发送文件的最佳方式
- 通过POST,只需将文件名和编码的消息放入一个后置参数?
- 在标题里面?
欢迎任何想法,如果可能的话显示一个小的http请求你应该怎么做。
在python中有一个很好的库'base64',该模块可以根据文件名和内容对文件进行编码/解码。我正在开发一个具有上传文件功能的API。我设法编写一些代码来对这些文件进行编码和解码,但通过HTTP请求发送此编码的base64消息的正确方法是什么?什么是通过HTTP通过base64编码发送文件的最佳方式
欢迎任何想法,如果可能的话显示一个小的http请求你应该怎么做。
我最近不得不这样做,因为django-tastypie不支持multipart/form-data。 klipstein已创建Base64FileField以支持使用base64编码文件的文件上传。
这里是基于Base64FileField一个例子:
#models.py
from django.db import models
class Person(models.Model):
name = models.CharField("name", max_length=40)
avatar = models.ImageField("avatar", upload_to="uploads/person_avatars")
def __unicode__(self):
return self.name
#views.py
import json
import base64
import sys
from django.core.files.uploadedfile import SimpleUploadedFile
from django.http import HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from .models import Person
MAX_SIZE = 10*1024*1024 #10MB
@csrf_exempt
def save_person(request):
if (request.method == "POST" and request.META.get("CONTENT_TYPE")
== "application/json"):
data = json.loads(request.raw_post_data)
avatar = data.get("avatar")
file = base64.b64decode(avatar["file"])
if sys.getsizeof(file) > MAX_SIZE:
response = {"error": {
"code": "invalid_request",
"message": "Max file size exceeded."
}}
return HttpResponseBadRequest(json.dumps(response),
mimetype="application/json")
person = Person(name=data.get("name"), avatar=SimpleUploadedFile(
avatar["name"],
file,
getattr(avatar, "content_type", "application/octet-stream")))
person.save()
response = {"id": person.id, "name": person.name,
"avatar": person.avatar.url}
return HttpResponse(json.dumps(response), mimetype="application/json")
response = {"error": {
"code": "invalid_request",
"message": "Method Not Allowed."
}}
return HttpResponseBadRequest(json.dumps(response),
mimetype="application/json")
下面是被张贴例如JSON体为上述观点
{
"name": "Test User",
"avatar": {
"name": "myfile.png",
"file": "a long base64 encoded string ",
"content_type": "image/png"
}
}
和实施例的响应为:
{
"id": 1,
"avatar": "/media/uploads/person_avatars/myfile.png",
"name": "Test User"
}
什么是最好的方法?
不确定这是否是最好的方法,但它简单明了。
Oki,我也在考虑这种方式,但是如何阻止文件>例如在这种情况下10MB? – user1839924 2013-04-09 12:30:47
我已经更新了文件大小检查的答案。 – pankaj28843 2013-04-09 13:10:01
您可能想要先阅读这篇文章:http://stackoverflow.com/questions/8659808/how-does-http-file-upload-work – 2013-04-09 08:43:29
我对fileupload不感兴趣,重点是我需要通过API传输文件。有可能通过单独的参数传递文件名和base64编码的消息,但我坚持如何阻止文件> 10MB例如 – user1839924 2013-04-09 12:32:02