【问题标题】:can't uplpoad photos in multipart form in django rest framework无法在 django rest 框架中以多部分形式上传照片
【发布时间】:2021-11-05 22:14:19
【问题描述】:

我有一个项目,用户可以在创建公告时上传多张照片,当使用表单数据从邮递员发送请求时,公告已成功添加但图像未上传, 当使用内容类型设置为:multipart/form-data 的原始 Json 时,出现以下错误:

"detail": "Multipart form parse error - Invalid boundary in multipart: None"

从可浏览 API 发送以下请求时:

{
    "name": "tractor",
    "address": "any",
    "price": 100,
    "author": 17,
    "photo": [
        {
            "name": "tractor",
            "image": "/C:/Users/Admin/Downloads/marteau.jpg"
        }
    ]
}

我收到以下错误:

"detail": "Multipart form parse error - Invalid boundary in multipart: None"

他是我的密码:

模型.py

class Photo(models.Model):
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to=nameFile, blank=True, null=True)

  
class Announcement(models.Model):
    author = models.ForeignKey(
        User, on_delete=models.CASCADE,  related_name='announcements')
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    price = models.FloatField(blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    rating = models.FloatField(blank=True, null=True)
    date = models.DateTimeField(auto_now_add=True)
    photo = models.ManyToManyField(Photo, blank=True)

Views.py

class AnnouncementCreate(CreateAPIView):
    queryset = models.Announcement.objects.all()
    serializer_class = AnnouncementSerializer
    parser_classes = (FormParser,MultiPartParser)
    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

class PhotoViewSet(ListAPIView):

    queryset = models.Photo.objects.all()
    serializer_class = PhotoSerializer

    def post(self, request, *args, **kwargs):
        file = request.data.get('image')
        image = models.Photo.objects.create(image=file)
        return HttpResponse(json.dumps({'message': "Uploaded"}), status=200)

序列化器.py

class AnnouncementSerializer(WritableNestedModelSerializer, serializers.ModelSerializer):
    parameters = ParameterSerializer(many=True, required=False)
    photo = PhotoSerializer(many=True, required=False)
class Meta:
        model = Announcement
        fields = ['id', 'name', 'address', 'date',
                  'price', 'description', 'author', 'parameters', 'photo']

class PhotoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo
        fields = ('name', 'image')


【问题讨论】:

    标签: python django django-rest-framework django-views photo-upload


    【解决方案1】:

    在询问这个问题之前我已经打开了一个问题,但遗憾的是,DRF 不支持带有 multipart/form-data 的嵌套可写序列化程序。

    这是我的问题:https://github.com/encode/django-rest-framework/issues/7262

    如果您可以摆脱嵌套序列化程序,那么您将能够正常上传带有 multipart/form-data 的文件,否则,您必须使用 application/json 并将您的文件编码为 base64 字符串,这样您就可以上传带有嵌套序列化程序的文件。

    【讨论】:

      【解决方案2】:

      您必须使用 MultiPartParser,因为 DRF 中的默认解析器是 Json 解析器,您不是发送 JSON,而是发送二进制文件

      https://www.django-rest-framework.org/api-guide/parsers/

      【讨论】:

      • 但我已经在使用它了,但它不起作用
      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2014-03-15
      • 2019-03-21
      相关资源
      最近更新 更多