2015-01-05 5 views
4

Я использую django-rest-framework.Django rest framework, загружающий несколько файлов

Есть ли способ обработки нескольких файлов? Кажется, что даже клиент отправляет несколько файлов (например, веб-браузер), MultiPartParser будет выбирать только первый файл.

+0

ФПИ использует Джанго 'MultiPartParser' так это, безусловно, обрабатывает несколько файлов. Можете ли вы показать свой код? – mariodev

+0

@mariodev, я не знаю, как писать сериализатор. Есть только FileField и ImageField, которые будут обрабатывать только один файл. – HanXu

ответ

2

Если вы намерены проверить несколько загруженных файлов, вам придется написать для этого свой собственный сериализатор. Для проверки списков объектов существует serializers.ListField. Я не пробовал это, но я полагаю, вы могли бы реализовать простой сериалайзер так:

class FileListSerializer (serializers.Serializer) : 

    files = serializers.ListField(
       child=serializers.FileField(max_length=100000, 
              allow_empty_file=False, 
              use_url=False) 
      ) 

Тогда, вероятно, вы могли бы проверить файлы, вызвав сериалайзер с точки зрения:

files = list(request.FILES.values()) 
files_serializer = FileListSerializer(data={"files": files}) 
if not file_serializer.is_valid() : 
    # handle error 
    ... 
+0

Это не работает ... Я пробовал, но файлы теряются в полевых проверках. –

0

Вы можете доступ к списку файлов через request.FILES.getlist('<your_payload_files_key>').

Я получил ответ от this SO answer.

1

Я понимаю, что это старый вопрос, но я просто провел некоторое время, ударяя головой об этом. Проблема в том, что Django's MultiPartParser, который использует DRF, возвращает files как MultiValueDict. Когда DRF затем добавляет файлы обратно к данным, которые передаются в сериализатор, он делает это с использованием .update() по данным (OrderedDict) в request.Request._load_data_and_files(). В результате, если несколько файлов загружаются одним и тем же ключом, только последний выживает [1] и делает его до сериализатора.

Документация Django рекомендует использовать метод .post() в FormView при использовании формы [2]. Альтернативой является подкласс анализатора и вызов dict() на filesMultiValueDict перед его возвратом, чтобы вместо этого возвращались списки. Я использую второй вариант, так как я все равно подклассифицирую парсер.

[1] https://docs.djangoproject.com/en/dev/_modules/django/utils/datastructures/

[2] https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#uploading-multiple-files