我正在使用django-rest-framework。
有没有办法处理多个文件上传?似乎即使客户端发送多个文件(通过Web浏览器),MultiPartParser也只会选择第一个文件。
答案 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得到了答案。