You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC控制器接收FormData异常:Ajax POST仅发送[object FormData]

解决FormData无法正确通过Ajax传递到Spring MVC的问题

问题根源

从你的curl请求能看到两个核心问题:

  1. 请求的Content-Type被设成了text/plain;charset=UTF-8,而FormData需要的是multipart/form-data格式,且浏览器会自动添加边界符(就是你期望格式里的那串分隔线)。
  2. 你把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配置与接收

  1. 确保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"/>
    
  2. 控制器接收参数
    可以直接用@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:01:17