You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework图片上传失败,请求技术支持

解决Django REST Framework图片上传报错:No file was submitted.

我之前也踩过一模一样的坑!咱们一点点排查解决:

先排查Postman的请求配置(最容易忽略的点)

你用的是Form-data上传文件,这几个细节一定要确认:

  • 别手动加Content-Type请求头:Postman会自动识别Form-data并生成multipart/form-data; boundary=xxx的请求头,手动添加反而会导致解析失败
  • 字段名完全匹配:确保Form-data里的key是thumbnail,和你序列化器里的字段名大小写、拼写完全一致
  • 确认文件已选中:有时候Postman会出现缓存,看起来选了文件但实际没加载,试试关闭重启Postman,或者新建一个请求重新测试

配置视图的文件解析器

DRF默认的解析器不一定能处理multipart/form-data类型的请求,所以要在你的视图里明确指定解析器:

from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response

class UserProfileUpdateView(APIView):
    parser_classes = (MultiPartParser, FormParser)  # 必须加上这两个解析器

    def patch(self, request):
        # 你的视图逻辑示例
        profile = request.user.profile
        serializer = UserProfileSerializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

如果你用的是ModelViewSet,同样在类里加上parser_classes = (MultiPartParser, FormParser)即可。

关于Base64ImageField的使用误区

你换了Base64ImageField但报错没变,是因为这个字段是用来处理JSON格式的Base64字符串的,不是Form-data上传。如果想用它,你需要把图片转成Base64字符串,放在JSON请求体里(请求头设为Content-Type: application/json),而不是用Form-data上传文件。

但你现在的需求是Form-data传图,完全没必要用Base64ImageField,换回默认的serializers.ImageField就可以。

序列化器和模型的小优化

序列化器里的ImageField可以简化,不需要额外参数:

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserProfile
        fields = ('status', 'thumbnail',)

模型里的upload_to='media/user/'可以改成'user/',因为Django的MEDIA_ROOT已经指向media目录了,这样上传的文件会存在MEDIA_ROOT/user/下,更规范。

按照上面的步骤调整后,再用Postman的Form-data上传,应该就能得到你期望的返回结果了:

{
    "status":"something",
    "thumbnail":"file/path"
}

内容的提问来源于stack exchange,提问作者Melissa Stewart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:41:32