【问题标题】:DRF Uploading to aws s3 multiple files(more than 1)DRF上传到aws s3多个文件(超过1个)
【发布时间】:2021-05-01 11:00:53
【问题描述】:

我的邮递员标题- 我有一个成功上传到 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())

【问题讨论】:

    标签: django amazon-s3 django-rest-framework


    【解决方案1】:

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

    所以RFC 7587

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

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

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

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

    接收旨在广泛适用的应用程序(例如,
    multipart/form-data 解析库)也应该支持旧的
    提供多个文件的方法。

    所以我认为你只需要发帖

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

    更多关于mozilla docsSO 中的边界。


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

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

    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)
    
    

    【讨论】:

    • 是的,我在我的问题中添加了带有标题的图片
    • 谢谢!我将 request.DATA 更​​改为 request.POST,原因是 request.DATA` 自 3.0 版 以来已被弃用而支持 request.data,现在得到了 django.utils.datastructures.MultiValueDictKeyError: 'upload' 任何想法?
    • 嗯,也许可以试试request.data 而不是request.POST['upload']。无论哪种方式,您都需要检查request.datarequest.POST,您会在其中找到您需要的内容:)
    • 更新了答案。也许这会起作用或request.data['files']
    • 在 SO stackoverflow.com/questions/39645410/… 上找到解决方案 :)
    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2022-11-03
    • 2016-10-17
    相关资源
    最近更新 更多