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
相关产品推荐
相关产品推荐

