Spring MVC控制器接收FormData异常:Ajax POST仅发送[object FormData]
解决FormData无法正确通过Ajax传递到Spring MVC的问题
问题根源
从你的curl请求能看到两个核心问题:
- 请求的
Content-Type被设成了text/plain;charset=UTF-8,而FormData需要的是multipart/form-data格式,且浏览器会自动添加边界符(就是你期望格式里的那串分隔线)。 - 你把FormData对象直接转成了字符串发送,所以出现了
[object FormData]这种无效内容。
前端修复方案
不管用原生JS还是jQuery,都要遵循这两个关键规则:不要手动处理FormData成字符串、不要手动设置Content-Type为text/plain。
原生JS(fetch)写法
// 构建FormData const formData = new FormData(); formData.append('docDate', '24/11/2022'); formData.append('docExpDate', '30/11/2022'); formData.append('docType', '你的文档类型值'); formData.append('_csrf', '53d02b64-61ab-4456-86f1-b1b76e46536c'); // 把CSRF Token加到FormData里 // 发送请求 fetch('http://127.0.0.1:8088/list/addDocs', { method: 'POST', body: formData, credentials: 'include' // 携带Cookie,保持会话 }) .then(res => res.text()) .then(result => console.log('请求成功:', result)) .catch(err => console.error('请求失败:', err));
jQuery Ajax写法
// 构建FormData const formData = new FormData(); formData.append('docDate', '24/11/2022'); formData.append('docExpDate', '30/11/2022'); formData.append('docType', '你的文档类型值'); // 推荐从页面meta标签取CSRF Token,避免硬编码 formData.append('_csrf', $('meta[name="_csrf"]').attr('content')); // 发送请求 $.ajax({ url: 'http://127.0.0.1:8088/list/addDocs', type: 'POST', data: formData, processData: false, // 禁止jQuery把FormData转成字符串 contentType: false, // 让浏览器自动设置正确的Content-Type和边界符 success: function(result) { console.log('请求成功:', result); }, error: function(xhr) { console.error('请求失败:', xhr.responseText); } });
后端Spring MVC配置与接收
确保MultipartResolver配置正确
如果是Spring MVC XML配置,添加:<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="52428800"/> <!-- 50MB上限 --> </bean>如果你用的是Servlet 3.0+(JBoss一般支持),可以用Spring自带的
StandardServletMultipartResolver,不需要额外依赖:<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>控制器接收参数
可以直接用@RequestParam逐个接收,或者绑定到实体类:@PostMapping("/list/addDocs") public String addDocs(@RequestParam("docDate") String docDate, @RequestParam("docExpDate") String docExpDate, @RequestParam("docType") String docType, @RequestParam("_csrf") String csrfToken) { // 你的业务处理逻辑 return "success"; }或者用实体类接收更简洁:
// 定义实体类 public class DocForm { private String docDate; private String docExpDate; private String docType; // 生成getter和setter方法 } // 控制器方法 @PostMapping("/list/addDocs") public String addDocs(@ModelAttribute DocForm docForm, @RequestParam("_csrf") String csrfToken) { // 处理逻辑 return "success"; }
关键注意点
- 不要把CSRF Token拼在URL里,直接加到FormData中更规范。
- 后端如果是Spring Boot,默认已经配置了MultipartResolver,不需要手动配置。
- 测试时可以用浏览器开发者工具的Network面板,查看请求的FormData是否正确,Content-Type是否为
multipart/form-data; boundary=xxx。
内容的提问来源于stack exchange,提问作者Irzan Fajari
相关产品推荐
相关产品推荐

