Tastypie ModelResource保存base64编码文件

时间:2014-09-05 05:06:17

标签: django python-3.x base64 tastypie

我在角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。

2 个答案:

答案 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