NextJS发送带图片FormData到Django出现MultiPartParserError报错求助
问题原因
你遇到的django.http.multipartparser.MultiPartParserError: Invalid boundary in multipart: None错误核心原因是前端fetch请求里手动设置了multipart/form-data类型的Content-Type,但没有附带对应的boundary分隔符参数。
当你使用fetch传递FormData对象时,浏览器会自动识别并添加带正确boundary的Content-Type请求头,手动覆盖这个头会导致boundary丢失,Django的MultipartParser无法拆分表单字段和文件数据。
修复步骤
1. 前端提交代码修改
删除fetch配置中headers里的"Content-Type": "multipart/form-data"字段,修改后的handleSubmit代码如下:
function handleSubmit(e) { e.preventDefault(); let data = new FormData(); data.append("userID", loggedInID); data.append("email", email); data.append("description", description); data.append("image", imageLink); fetch("http://127.0.0.1:8000/user/edit_profile/", { method: "POST", headers: { // 移除手动设置的Content-Type,让浏览器自动生成 "X-CSRFToken": csrfToken, }, credentials: "include", body: data, }).then((response) => response.json()); // 建议加上json()处理返回结果 }
2. 后端Django代码适配
注意parser_classes是Django REST Framework(DRF)的专属配置,仅对DRF的API视图生效,如果你使用的是DRF,需要给视图加上@api_view装饰器才能正确解析数据,修改后的视图代码参考:
from rest_framework.decorators import api_view, parser_classes from rest_framework.parsers import FormParser, MultiPartParser from django.http import JsonResponse @api_view(['POST']) @parser_classes([FormParser, MultiPartParser]) def editProfileView(request): # 普通字段从request.data取 user_id = request.data.get('userID') email = request.data.get('email') description = request.data.get('description') # 图片文件从request.FILES取(也可以直接从request.data取,DRF会统一处理) image = request.FILES.get('image') # 测试打印 print("普通字段:", user_id, email, description) print("上传的文件:", image) return JsonResponse({"code": 0, "msg": "提交成功"})
如果你没有使用DRF,就是原生Django视图,不需要加parser_classes,直接从request.POST取普通字段,request.FILES取文件即可。
验证方法
修改完成后打开浏览器开发者工具的「网络」面板,查看提交请求的请求头,确认Content-Type值为multipart/form-data; boundary=----WebKitFormBoundaryXXX格式,后端即可正常解析FormData数据。
内容的提问来源于stack exchange,提问作者ernest30

