Django REST框架上传多个文件

8

我正在使用django-rest-framework

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


DRF使用Django的MultiPartParser,因此它肯定可以处理多个文件。你能展示一下你的代码吗? - mariodev
@mariodev,我不知道如何编写序列化器。只有FileField和ImageField,它们只能处理单个文件。 - HanXu
3个回答

4
我知道这是一个旧问题,但我刚刚花了一些时间来解决这个问题。问题在于Django的MultiPartParser(DRF使用)将files作为MultiValueDict返回。然后,当DRF将文件添加回传递给序列化程序的数据时,它会在request.Request._load_data_and_files()中对数据(一个OrderedDict)使用.update()。结果是,如果使用相同键上传多个文件,则只有最后一个文件[1]会被保留并传递给序列化程序。
Django的文档建议在使用表单[2]时重写FormView中的.post()方法。另一种选择是子类化解析器,并在返回之前调用dict()以将filesMultiValueDict转换为列表,而不是将其缩减为其最后一个值。我正在使用第二个选项,因为我已经在子类化解析器。

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

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


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
    ...

2
这个不起作用...我已经尝试过了,但是文件在字段验证中丢失了。 - Arpit Goyal

2
您可以通过request.FILES.getlist('<your_payload_files_key>')访问文件列表。
我从这个SO答案中得到了答案。

是的,这就是我在普通的Django表单中处理它的方式 - 简单易懂! - geekscrap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接