我在角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__(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。但它不起作用。我需要从中获取文件大小。该字符串存储在变量file_data中。我试过base64的b64decode。即使没有存储解码工作文件。
使用python 3.4和django 1.6。
答案 0 :(得分:0)
我不确定Tastypie的其他版本是否存在差异,但对于v0.10.0(及以下版本),此问题的答案建议的方法对我有用:
这是一个Resource类的示例,它覆盖了TastyPie的 ModelResource 的反序列化方法:
class MultipartResource(object):
"""
multi-part resource for uploads
Resource definition for deserializing file/image uploads
* see:
https://github.com/toastdriven/django-tastypie/issues/42
"""
def deserialize(self, request, data, format=None):
if not format:
format = request.META.get('CONTENT_TYPE', 'application/json')
if format == 'application/x-www-form-urlencoded':
return request.POST
if format.startswith('multipart'):
data = request.POST.copy()
upload = request.FILES
data.update(upload)
return data
return super(MultipartResource, self).deserialize(request, data, format)
在 api.py 中,您可以像这样声明您的资源并正常访问反序列化的数据:
class MyResource(MultipartResource, ModelResource):
def hydrate(self, bundle):
upload = bundle.data.get('attach')
# ....
注意:这假设您的前端正在将数据作为常规POST数据发送到您的API - 上传不需要编码。但它需要作为“multipart / form-data”发送:
<form action="#" method="post" enctype="multipart/form-data">
...
答案 1 :(得分:0)
您可以将上传作为Route::post('surveys/{id}/ajax',function (){
auth()->user()->unreadNotifications()->update(['read_at' => \Carbon\Carbon::now()]);
})->name('ajax');
数据处理,如@kchan的回答所示。但是,如果您将图像作为base64编码的字符串发送,则可以覆盖multipart
方法
obj_create