Django休息框架上传多个文件

时间:2015-01-05 18:08:06

标签: django django-rest-framework

我正在使用django-rest-framework

有没有办法处理多个文件上传?似乎即使客户端发送多个文件(通过Web浏览器),MultiPartParser也只会选择第一个文件。

3 个答案:

答案 0 :(得分: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
    ...

答案 1 :(得分:1)

我意识到这是一个老问题,但我只是花了一些时间来反对这个问题。问题在于,DRF使用的Django的MultiPartParser会将files作为MultiValueDict返回。然后,当DRF将文件添加回传递给序列化程序的数据时,它会使用.update()OrderedDict中的数据(request.Request._load_data_and_files())执行此操作。结果是,如果使用相同的密钥上传多个文件,则只有最后一个文件存活[1]并使其远离序列化程序。

如果使用表单[2],Django的文档建议覆盖.post()中的FormView方法。另一种方法是对解析器进行子类化,并在返回之前在dict() files上调用MultiValueDict,以便返回列表而不是。我正在使用第二个选项,因为我还是已经对解析器进行了子类化。

[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

答案 2 :(得分:0)

您可以通过request.FILES.getlist('<your_payload_files_key>')访问文件列表。

我从this SO answer得到了答案。