JSON中的Django REST框架FileField数据

时间:2014-11-06 05:50:13

标签: django django-rest-framework django-file-upload

在Django REST Framework(DRF)中,如何支持对base64编码的二进制数据进行反序列化?

我有一个模特:

class MyModel(Model):
   data = models.FileField(...)

我希望能够将此数据作为base64编码发送,而不是必须使用多部分表单数据或“文件上载”。查看Parsers,只有FileUploadParserMultiPartParser似乎会解析文件。

我希望能够以JSON之类的方式发送此数据(即在data而不是files中发送二进制数据:

{
 'data':'...'
}

3 个答案:

答案 0 :(得分:3)

我通过创建新的Parser

解决了这个问题
def get_B64_JSON_Parser(fields):
    class Impl(parsers.JSONParser):
        media_type = 'application/json+b64'

        def parse(self, *args, **kwargs):
            ret = super(Impl, self).parse(*args, **kwargs)
            for field in fields:
                ret[field] = SimpleUploadedFile(name=field, content=ret[field].decode('base64'))
            return ret
    return Impl

然后我在View中使用

class TestModelViewSet(viewsets.ModelViewSet):
    parser_classes = [get_B64_JSON_Parser(('data_file',)),]

答案 1 :(得分:2)

这是一个老问题,但对于那些寻找最新解决方案的人来说,有一个DRF插件(drf_base64)来处理这种情况。它允许在JSON请求中读取编码为base64字符串的文件。

所以给出了一个类似的模型:

class MyModel(Model):
   data = models.FileField(...)

和预期的json如:

{
  "data": "data:image/png;base64,iVBORw0KGgoA ....",
  ...
}

只能从drf_base模块而不是drf本身导入(des)序列化。

来自drf_base64.serializers的

导入ModelSerializer 来自.models导入MyModel

class MyModel(ModelSerializer):

    class Meta:
        model = MyModel

请记住,使用FileReader API在javascript中获取base64编码文件是可行的。

答案 2 :(得分:0)

你可以在序列化程序级别做一些聪明的事情,但首先想到的是在视图中做到这一点。

第1步:写入文件。类似的东西:

fh = open("/path/to/media/folder/fileToSave.ext", "wb")
fh.write(fileData.decode('base64'))
fh.close()

第2步:在模型上设置文件。类似的东西:

instance = self.get_object()
instance.file_field.name = 'folder/fileToSave.ext' # `file_field` was `data` in your example
instance.save()

请注意步骤1的绝对路径和步骤2中相对于媒体文件夹的路径。

这至少应该让你前进。

理想情况下,您可以将其指定为序列化字段,并免费获得模型实例的验证和自动分配。但乍一看似乎复杂