Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Tastypie ModelResource保存base64编码文件_Django_Python 3.x_Base64_Tastypie - Fatal编程技术网

Django Tastypie ModelResource保存base64编码文件

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

我正在用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__(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(及以下版本),回答此问题所建议的方法对我有效:

  • 另见:
这是覆盖TastyPie的ModelResource的反序列化方法的资源类示例:

在api.py中,您可以这样声明资源并正常访问反序列化数据:

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