使用Spring RestTemplate发送Post multipart(PDF)请求遇400错误求助
兄弟,400 Bad Request这个错误确实磨人,我之前上传文件时也踩过好几个类似的坑,咱们一步步拆解排查:
最常见的几个原因&解决方法
1. 请求头Content-Type设置错误
上传文件的请求必须用multipart/form-data类型,但很多人会不小心设成application/json或者手动写错格式。
- 如果用浏览器原生
FormData,不用手动设置Content-Type,浏览器会自动带上正确的头(包括multipart边界); - 如果是Node.js里用axios/request库,确保不要手动覆盖Content-Type,让FormData自动处理。比如axios里只要你传的是FormData实例,它会自动设置正确的头;
- 额外检查:后端要求的其他必填头(比如
Authorization、X-API-Key)有没有加对,拼写和值都不能错。
2. FormData构造不符合后端要求
这是最容易出错的点:
- 字段名不匹配:后端接口要求的文件字段名是
file还是document?比如后端要uploaded_file,你写成pdf_file,直接就会被校验打回; - 文件对象无效:浏览器里要确保取到的是
input.files[0](不是input本身),Node.js里要用fs.createReadStream读取文件,不能直接传文件路径字符串; - 可选但建议加文件名:append的时候第三个参数传文件名,避免后端解析时出现异常。比如:
// 浏览器端正确示例 const formData = new FormData(); formData.append('document', document.getElementById('pdf-input').files[0], 'my-document.pdf'); // Node.js + axios示例 const formData = new FormData(); formData.append('document', fs.createReadStream('./my-document.pdf'), { filename: 'my-document.pdf' });
3. 文件大小超过后端限制
很多后端会设置上传文件的大小上限,比如:
- Nginx的
client_max_body_size配置; - Spring Boot的
spring.servlet.multipart.max-file-size; - Express的
multer中间件限制。
如果你的PDF超过这个大小,后端会直接返回400。先检查文件大小,或者联系后端确认允许的最大值。
4. 缺失后端要求的其他表单参数
有些接口除了文件,还需要额外的表单字段(比如user_id、doc_type),如果漏加这些必填参数,后端校验不通过就会返回400。记得把这些参数也加到FormData里:
formData.append('user_id', '12345'); formData.append('doc_type', 'INVOICE');
5. 请求路径或代理问题
- 先确认端点URL有没有写错:有没有多打/少打斜杠?环境是不是正确(测试环境vs生产环境)?
- 如果用了代理工具(比如Charles、Fiddler),检查证书是否被信任,代理会不会篡改请求内容导致格式错误。
快速排查步骤
- 先用Postman或curl手动测试接口,看能不能成功上传。比如curl命令:
curl -X POST -F "document=@your-file.pdf" https://your-api-endpoint.com/upload
如果Postman能成功,那问题肯定在你的代码里;如果Postman也失败,直接找后端同事确认接口配置。
2. 打开浏览器开发者工具(F12),查看Network面板里的请求详情:
- 检查Request Headers里的Content-Type是不是
multipart/form-data; boundary=xxx; - 查看Form Data里的字段和文件是不是正确,有没有空值。
如果还是解决不了,把你的代码片段、请求头详情贴出来,我再帮你定位!
内容的提问来源于stack exchange,提问作者Ahmed Lotfy
相关产品推荐
相关产品推荐

