2014-11-06 108 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。