【问题标题】:File Upload handling in Django rest frameworkDjango rest框架中的文件上传处理
【发布时间】:2023-03-23 06:20:01
【问题描述】:

我正在尝试在我的 django 模型中添加一个文件字段,但我不确定如何处理来自 React 前端的文件。

模型.py

class Product(models.Model):
    
    name = models.CharField(max_length=500, default=0)
    short_code = models.CharField(max_length=500, default=0,unique=True)
    document = models.FileField(upload_to='products/', null=True, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

序列化器.py

class ProductSerializer(serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = "__all__"

当文件从前端上传时,它会在网络中出现以下错误

{"detail":"不支持的媒体类型"multipart/form-data 边界=967753268136369" 在请求中。"}

我已经阅读了 DRF 的文档,我确信我需要在其中实现 MultiParser,但我不确定如何。 还有没有更好的方法来处理“文件处理”?我在应用程序中使用 Ant Design File Upload

【问题讨论】:

    标签: django reactjs django-rest-framework antd


    【解决方案1】:

    在您的通用视图或视图集中指定MultiPartParser,然后media-type被解析器动态设置为multipart/form-data,这将解析多部分HTML表单内容,支持文件上传

    from rest_framework.parsers import MultiPartParser
    
    class ProductViewSet(viewsets.ModelViewSet):
        parser_classes = [MultiPartParser]
        ...
    

    或者您可以使用FileUploadParser,如DRF Doc 中所述,如下所示:

    class FileUploadView(views.APIView):
        parser_classes = [FileUploadParser]
    
        def put(self, request, filename, format=None):
            file_obj = request.data['file']
            # ...
            # do some stuff with uploaded file
            # ...
            return Response(status=204)
    
    # urls.py
    urlpatterns = [
        # ...
        url(r'^upload/(?P<filename>[^/]+)$', FileUploadView.as_view())
    ]
    

    注意:这种方式需要手动设置请求头Content-Disposition: attachment; filename=upload.jpg

    FileUploadParser 用于可以上传的本地客户端 文件作为原始数据请求。 用于基于网络的上传,或用于原生 支持分段上传的客户端,您应该使用 改为MultiPartParser

    【讨论】:

    • 使用路由器的时候是不是同一个url?
    猜你喜欢
    • 2015-10-04
    • 2013-12-26
    • 2016-10-25
    • 2016-02-16
    • 2021-09-27
    • 1970-01-01
    • 2019-09-18
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多