现象

前端用ajax方式提交表单,代码类似于下面的例子。

var formData = new FormData();

// HTML 文件类型input,由用户选择
formData.append("file", fileInputElement.files[0]);
$.ajax({
url: 'url,
type: 'POST',
data: formdata, // 上传formdata封装的数据
cache: false, // 不缓存
processData: false, // jQuery不要去处理发送的数据
contentType: 'multipart/form-data', // jQuery不要去设置Content-Type请求头,如果上传文件的话,千万不能加contentType,这里是坑!!!!!!contentType:false,就行了
success:function (data) { //成功回调
console.log(data);
}
});

后端用spring接收,具体方法见:https://www.cnblogs.com/liuboyuan/p/11607484.html

前端提交请求后,后端spring报错:

FileUploadException: the request was rejected because no multipart boundary was found

排坑过程

一、前端提交时尝试各种contentType

后端始终接收不到文件流。

二、直接用html中最原始的form提交

<form id="myForm" name="myForm" method="post"  enctype="multipart/form-data" action="url">
<div>
<input type="file" id="whiteList" name="whiteList">
</div>
<input type="submit" value="Submit!">
</form>

后端收到了文件,因此定位是前端的问题。

比较ajax提交和原生form提交的请求头后发现:虽然原生form指定了enctype="multipart/form-data",但发送出去的contentType变成了Content-Type: multipart/form-data; boundary=----WebKitFormBoundary0E8eVHYtBOBtRyIO,浏览器帮我加了个boundary。然后重新去网上看了下multipart/form-data,明白了multipart/form-data要用boundary分割参数,因此boundary必不可少。

原生form提交的时候虽然指定enctype,但浏览器会自动加上boundary。ajax请求如果指定了Content-Type,浏览器不会自动加上boundary,还是 multipart/form-data,因此缺少了boundary,导致后端报错。

解决

在现象里的代码的注释里已经写出来了,ajax提交文件的时候别指定contentType就行了,浏览器会为contentType自动加上带boundary的 multipart/form-data。

spring无法接收上传文件的更多相关文章

  1. Spring Boot 在接收上传文件时,文件过大异常处理问题

    Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...

  2. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  3. RestTemplate OR Spring Cloud Feign 上传文件

    SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收. 将文件的字节流,放入ByteA ...

  4. spring mvc CommonsMultipartResolver上传文件异常处理

    近期已经上线的项目出现了一个异常 严重: Servlet.service() for servlet JeeCmsAdmin threw exception org.apache.commons.fi ...

  5. springMVC+spring+hibernate注解上传文件到数据库,下载,多文件上传

    数据库 CREATE TABLE `annex` ( `id` bigint() NOT NULL AUTO_INCREMENT, `realName` varchar() DEFAULT NULL, ...

  6. Java Servlet 接收上传文件

    在Java中使用 Servlet 来接收用户上传的文件,需要用到两个apache包,分别是 commons-fileupload 和 commons-io 包: 如果直接在doPost中,使用requ ...

  7. spring boot(十七)上传文件

    上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spring Boot上传文件的小案例. 1.pom包配置 我们使用Spring Boot最新版本1.5.9. ...

  8. spring cloud feign 上传文件报not a type supported by this encoder解决方案

    上传文件调用外部服务报错: not a type supported by this encoder 查看SpringFormEncoder类的源码: public class SpringFormE ...

  9. 利用spring的CommonsMultipartResolver上传文件

    1.CommonsMultipartResolver是spring里面提供的一个上传方式,效率我不知道,但是加入spring容器管理还是很不错的. 2.先看依赖包pom.xml <project ...

随机推荐

  1. Thymeleaf入门到吃灰

    Thymeleaf 官网部分翻译:反正就是各种好 Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎 Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymel ...

  2. php strtoupper()函数 语法

    php strtoupper()函数 语法 作用:把所有字符转换为大写 语法:strtoupper(string) 参数: 参数 描述 string 必须,规定要转换的字符串 说明:strtouppe ...

  3. Linux0.11内核源码——内核态线程(进程)切换的实现

    以fork()函数为例,分析内核态进程切换的实现 首先在用户态的某个进程中执行了fork()函数 fork引发中断,切入内核,内核栈绑定用户栈 首先分析五段论中的第一段: 中断入口:先把相关寄存器压栈 ...

  4. flutter中的命名路由

    命名路由是区别于基本路由的一种存在,方便于大型项目中路由的统一管理,现在,在前面基本路由的项目基础上实现实现命名路由. 使用步骤 路由配置 命名路由在使用前,需要在根组件main.dart中进行简单的 ...

  5. C++ 使用STL string 实现的split,trim,replace-修订

    写个小工具函数 #include <iostream> #include <vector> using namespace std; namespace strtool { s ...

  6. pycharm运行html文件报404错误

    某次发现运行导入的html文件的时候,打开浏览器会报404错误: 而运行自己写的html文件则正常显示: 最后发现这是pycharm缓存问题,只需重启pycharm清除缓存就ok啦!

  7. Java学习之多线程(线程安全问题及线程同步)

    一.线程安全问题产生前提:1.多线程操作共享数据2.线程任务中有多条代码 class Ticket implements Runnable { //2.共享数据 private int num = 1 ...

  8. delphi vlc 安装bug 处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC"

    处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC" [摘要:http://blog.csdn ...

  9. 爬取拉勾网所有python职位并保存到excel表格 对象方式

    # 1.把之间案例,使用bs4,正则,xpath,进行数据提取. # 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json ...

  10. Cocos2d-x之MessageBox

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中使用的对话框为MessageBox,因为cocos2d-x已经包装好了:但是在一般的游戏设置中,我们不会使用coco ...