2014-11-06 106 views
1

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

我有一个模型:

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

,我希望能够发送这个数据作为base64编码,而不必多部分表单数据或“文件上传”。看着Parsers,只有FileUploadParserMultiPartParser似乎解析出这些文件。

我希望能够在像JSON发送该数据(即发送二进制数据在data而非files

{ 
'data':'...' 
} 

回答

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

这至少应该让你去的绝对路径和。

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

+0

这似乎是解码'Serializer'中的二进制文件的第三种选择,或者'View'将在'Parser'中执行。那么我的问题就是如何编写一个解析器来知道哪些字段需要'base64'解码。 – 2014-11-06 18:07:12

+0

那么在第一种情况下只是硬编码它。如果你再次需要它有一个参数。 – 2014-11-06 18:13:59

+0

你的意思是写一些类似:'parser_classes =(get_B64_JSON_Parser(('field_a',)),)' – 2014-11-06 18:16:37

2

我解决它通过创建一个新的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',)),] 
+0

我很喜欢这个。 – 2014-11-07 09:21:42

0

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

因此,考虑像模特:

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

和预期的JSON,如:

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

的(DES)的序列化可以处理从drf_base模块而不是DRF本身只是进口。

from drf_base64.serializers进口ModelSerializer from。模型导入为MyModel

class MyModel(ModelSerializer): 

    class Meta: 
     model = MyModel 

只记得是更多钞票来获得编码后的文件中的JavaScript与FileReader API一个base64。