【问题标题】:Django rest framework uploading multiple filesDjango rest框架上传多个文件
【发布时间】:2015-01-05 18:08:05
【问题描述】:

我正在使用django-rest-framework

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

【问题讨论】:

  • DRF 使用 django 的 MultiPartParser 所以它肯定可以处理多个文件。你能展示你的代码吗?
  • @mariodev,我不知道如何编写序列化程序。只有FileField和ImageField,只处理单个文件。

标签: django django-rest-framework


【解决方案1】:

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

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

[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】:

    如果您打算验证多个上传的文件,那么您必须为此编写自己的序列化程序。有一个 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
        ...
    

    【讨论】:

    • 这不起作用...我已经尝试过了,但文件在字段验证中丢失了。
    【解决方案3】:

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

    我从this SO answer得到了答案。

    【讨论】:

    • 是的,这就是我以普通 django 形式处理它的方式 - 简单!
    猜你喜欢
    • 2019-09-18
    • 2015-10-04
    • 2013-12-26
    • 2016-10-25
    • 2017-01-31
    • 2016-02-16
    • 2021-09-27
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多