Django Tastypie ModelResource保存base64编码文件
我正在用angular js和django做一个项目 这就是模型Django Tastypie ModelResource保存base64编码文件,django,python-3.x,base64,tastypie,Django,Python 3.x,Base64,Tastypie,我正在用angular js和django做一个项目 这就是模型 class MessageAttachments(models.Model): filename = models.CharField(max_length=100) file_size = models.IntegerField(max_length=100) attachment = models.FileField(upload_to='files/') def __unicode__(se
class MessageAttachments(models.Model):
filename = models.CharField(max_length=100)
file_size = models.IntegerField(max_length=100)
attachment = models.FileField(upload_to='files/')
def __unicode__(self):
return self.filename
在api.py中,我编写了自己的函数来保存邮件附件
def send(self, request, **kwargs):
self.method_check(request, allowed=['post'])
data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
file_data = data.get('attach', '')
try:
b = file_data.encode('utf-8')
message_attach = MessageAttachments()
message_attach.filename = 'file'
message_attach.file_size = 'file'
message_attach.attachment = ContentFile(b64decode(b), 'test')
message_attach.save()
return self.create_response(request, {
'success': True,
'msg': msg.id
})
except:
return self.create_response(request, {
'success': False
})
如您所见,我尝试了ContentFile。但它不起作用。我也需要从中得到文件大小。字符串存储在变量文件_数据中。我试着从base64解码B64。即使没有存储解码工作文件
我正在使用python 3.4和django 1.6 我不确定其他版本的Tastypie是否存在差异,但对于v0.10.0(及以下版本),回答此问题所建议的方法对我有效:
- 另见:
class MyResource(MultipartResource, ModelResource):
def hydrate(self, bundle):
upload = bundle.data.get('attach')
# ....
注意:这假设前端将数据作为常规POST数据发送到API——上传不需要编码。但它需要作为“多部分/表单数据”发送:
...
您可以将上传作为多部分数据处理,如@kchan的回答所示。但是,如果将图像作为base64编码字符串发送,则可能会覆盖obj_create
方法
import base64
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
class MyResource(MultiPartResource, ModelResource):
# ....
# attach the base64 encoded media in image
def obj_create(self, bundle, request=None, **kwargs):
image_encoded = bundle.data['image']
image_decoded = base64.b64decode(image_encoded)
# I am hard coding extension to jpeg, you may guess extension from mime type
image_file = NamedTemporaryFile(suffix='.jpeg', delete=True)
image_file.write(image_decoded)
image_file.flush()
# change MyResource to your resource name
res = super(MyResource, self).obj_create(bundle, request=request, **kwargs)
# assuming you ImageField name is image
res.obj.image.save(image_file.name, File(image_file))
return res
“send”方法属于哪个类?根据我使用Tastypie的v0.10.0的经验,您需要重写ModelResource的“反序列化”方法。并确保您的上传被编码为“multipart/form data”——然后您可以从request.FILES获得文件上传。它是类MessagesResource的一部分。上传是在angularjs中完成的。如何在那个里做多部分?能否指定如何重写反序列化。。还有其他变量需要从反序列化中接收。为什么ContentFile不工作?我在下面添加了一个答案。请看看这是否适合你。
<form action="#" method="post" enctype="multipart/form-data">
...
import base64
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
class MyResource(MultiPartResource, ModelResource):
# ....
# attach the base64 encoded media in image
def obj_create(self, bundle, request=None, **kwargs):
image_encoded = bundle.data['image']
image_decoded = base64.b64decode(image_encoded)
# I am hard coding extension to jpeg, you may guess extension from mime type
image_file = NamedTemporaryFile(suffix='.jpeg', delete=True)
image_file.write(image_decoded)
image_file.flush()
# change MyResource to your resource name
res = super(MyResource, self).obj_create(bundle, request=request, **kwargs)
# assuming you ImageField name is image
res.obj.image.save(image_file.name, File(image_file))
return res