通过Postman向Django后端POST上传图片失败问题求助
问题根因
- 使用
JSONParser解析文件上传请求:文件上传需要用multipart/form-data格式提交,JSON格式无法传输二进制文件数据,导致后端无法读取到上传的图片。 - 序列化器未接收文件数据:DRF的序列化器处理文件字段时,需要单独传入
files参数,仅传入普通表单数据无法完成图片字段的校验。 - 序列化器参数位置错误:
required=False是字段级参数,实例化序列化器时传入该参数不会生效,无实际作用。
修正方案
1. 视图代码修改
@csrf_exempt def image_list(request): if request.method=='GET': images=Upload.objects.all() serializers=ImageSerializer(images,many=True) return JsonResponse(serializers.data,safe=False) elif request.method=='POST': # 移除JSONParser,直接传入原生表单数据和文件数据 serializer=ImageSerializer(data=request.POST, files=request.FILES) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data,status=201) # 调试阶段可打印错误信息,快速定位校验失败原因 print(serializer.errors) return JsonResponse(serializer.errors,status=400)
如果你想要使用DRF的自动请求解析能力,可以给视图加上@api_view(['GET', 'POST'])装饰器,即可直接使用request.data接收所有类型的请求数据:
from rest_framework.decorators import api_view @api_view(['GET', 'POST']) @csrf_exempt def image_list(request): if request.method=='GET': images=Upload.objects.all() serializers=ImageSerializer(images,many=True) return JsonResponse(serializers.data,safe=False) elif request.method=='POST': serializer=ImageSerializer(data=request.data, files=request.FILES) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data,status=201) return JsonResponse(serializer.errors,status=400)
2. 必要依赖与配置检查
- 确保安装了图片处理依赖Pillow,未安装可执行命令:
pip install pillow - 在项目
settings.py中添加媒体文件存储配置:
MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media'
- 在根路由文件中添加媒体文件访问路由,方便后续直接访问上传的图片:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 原有路由配置 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
3. 请求提交规范
提交POST上传请求时,需要将请求头的Content-Type设置为multipart/form-data,不要使用JSON格式提交。如果用Postman测试,在body选项卡选择form-data,参数key填写image_file,类型选择File,再选择本地图片提交即可。
内容的提问来源于stack exchange,提问作者Rihab sabri
相关产品推荐
相关产品推荐

