首页 > 解决方案 > DRF上传到aws s3多个文件(超过1个)

问题描述

我来自 Postman 的标头在此处输入图像描述- 我有成功上传到 AWS s3 存储桶图像的端点,但是当我尝试上传多个文件时,它上传了最后一个文件。我该如何解决?在此处输入图像描述

我的观点:

class MediaViewSet(mixins.CreateModelMixin,
                   viewsets.GenericViewSet):
    queryset = Media.objects.all()
    serializer_class = MediaSerializer
    permission_classes = (IsAuthenticated,)

我的序列化器:

class MediaSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Media
        fields = ('uploaded_at', 'upload')

我的模型:

class Media(models.Model):
    uploaded_at = models.DateTimeField(auto_now_add=True)
    upload = models.FileField(storage=MediaStorage())

标签: djangoamazon-s3django-rest-framework

解决方案


我从来没有这样做过,但我认为它应该由浏览器通过标题处理。

所以RFC 7587

4.3. 一个表单域的多个文件

表单域的表单数据可能包含多个文件。

[RFC2388] 建议使用嵌套的“多部分/混合”部分传输单个表单字段的多个文件。此用法已弃用。

为了匹配广泛部署的实现,必须通过在单独的部分中提供每个文件来发送多个文件,但所有文件都具有相同的“名称”参数。

接收旨在广泛适用的应用程序(例如,
多部分/表单数据解析库)还应该支持提供多个文件的旧
方法。

所以我认为你只需要发布

Content-Type: multipart/form-data; boundary=something; name="file"

更多关于Mozilla 文档SO中的边界。


你能列出你发送的所有标题吗?

好的,所以你的标题是正确的。你有几个选择。

  1. 这个想法听起来不太好。如果可能,一个一个上传文件,因为 POST 应该返回 1 个新实体。
  2. 覆盖create方法,并在初始化序列化程序时传递many=True给它或一一创建它们。
  3. 创建一个单独的视图,这样UploadMultipleFiles(GenericViewSet)您就可以完全控制正在发生的事情。
  4. 甚至UploadMultipleFiles(CreateAPIView)

我认为您应该选择第二个选项,这样应该可以

    def perform_create(self, serializer):
        return serializer.save()

    def create(self, request, *args, **kwargs):
        uploaded_files = []

        for uploaded_file in request.FILES:
            serializer = self.get_serializer(upload=uploaded_file)
            serializer.is_valid(True)
            instance = self.perform_create(serializer)
            uploaded_files.append(instance)

        response_serializer = self.get_serializer(uploaded_files, many=True)
        headers = self.get_success_headers(response_serializer.data)
        return Response(response_serializer.data, status=status.HTTP_201_CREATED, headers=headers)


推荐阅读