2014-11-06 7 views
1

В Django REST Framework (DRF), как мне поддерживать де-сериализацию base64 закодированных двоичных данных?Django REST Framework FileField Data в JSON

У меня есть модель:

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

, и я хочу, чтобы иметь возможность отправить эти данные в виде base64 закодированных вместо того, чтобы многокопийные данные форм или «Загрузить файл». Глядя на Parsers, только FileUploadParser и MultiPartParser, похоже, разбирают файлы.

Я хотел бы иметь возможность отправить эти данные в нечто вроде JSON (т.е. посылать двоичные данные в data, а не files:

{ 
'data':'...' 
} 

ответ

0

Там, наверное, что-то умное вы можете сделать на уровне serialiser но первое, что приходит на ум, чтобы сделать это с точки зрения

Шаг 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.

Это должно, по крайней мере, чтобы вы собираетесь.

В идеале вы должны указать это как поле сериализатора и получить подтверждение и автоматическое присвоение экземпляру модели бесплатно. Но это кажется сложным на первый взгляд.

+0

По-видимому, третий вариант декодирования двоичного файла в «Сериализаторе» или «Просмотр» должен был бы сделать это в «Парсере». Тогда мой вопрос заключался бы в том, как написать синтаксический анализатор, который знает, какие поля для 'base64' декодируются. –

+0

Ну в первом случае просто жестко его код. Если вам это нужно, у вас есть параметр. –

+0

Вы имеете в виду написать что-то вроде: 'parser_classes = (get_B64_JSON_Parser (('field_a',)),)' –

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

Мне это очень нравится. –

0

Это старый вопрос, но для тех, кто ищет последнюю -date, есть плагин для DRF (drf_base64), который обрабатывает эту ситуацию. Он позволяет считывать файлы, закодированные как строки base64 в запросе JSON.

Так дали модели, как:

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

и ожидаемый: как JSON

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

The (дез) сериализации может быть обработан только импорт из drf_base модулей вместо самого ФПИ.

от drf_base64.serializers import ModelSerializer из.Модели импорта MyModel

class MyModel(ModelSerializer): 

    class Meta: 
     model = MyModel 

Просто помните, что это Возможное, чтобы получить base64 закодированный файл в JavaScript с FileReader API.

Смежные вопросы