2

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

我有一个模型:

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

我希望能够以 base64 编码的形式发送这些数据,而不必发送多部分表单数据或“文件上传”。查看Parsers, onlyFileUploadParser并且MultiPartParser似乎解析出文件。

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

{
 'data':'...'
}
4

3 回答 3

4

我通过创建一个新的来解决它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',)),]
于 2014-11-06T21:02:38.077 回答
2

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

所以给定一个模型:

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

和一个预期的json,如:

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

(des) 序列化可以仅从 drf_base 模块而不是 drf 本身导入来处理。

从 drf_base64.serializers 导入 ModelSerializer 从 .models 导入 MyModel

class MyModel(ModelSerializer):

    class Meta:
        model = MyModel

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

于 2017-06-22T16:12:25.967 回答
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 中相对于媒体文件夹的路径。

这至少应该让你继续前进。

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

于 2014-11-06T17:48:54.320 回答