现象

前端用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. 前端-使用template-web.js【模版引擎】渲染数据

    通过ajax请求到的数据,使用传统的拼接字符串也可以做到,但是‘ “ ” ‘这种模式,单引号.双引号容易 扩错,新手入门推荐使用这种,初入前端,需要一个一个敲代码体会一下. 使用 template.j ...

  2. mobx学习笔记04——mobx常用api

    1 可观察的数据(observable) observable是一种让数据的变化可以被观察的方法. 那些数据可被观察? -原始类型 String.Number.Boolean.Symbol -对象 - ...

  3. APP定位元素几种方法

    APP元素定位和操作 webdriver 提供了八种元素定位方法: 在 Python 语言中对应的定位方法如下:find_element_by_id()find_element_by_name()fi ...

  4. python学习笔记(四)字符串及字符串操作

    字符串 字符串可以存任意类型的字符串,比如名字,一句话等等. 字符串还有很多内置方法,对字符串进行操作,常用的方法如下: name1='hello world' print(name.capitali ...

  5. fileupload组件之上传与下载的页面

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. spring-cloud:利用eureka实现服务提供与调用示例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCl ...

  7. window server 2008 r2 安装ftp

    一.安装ftp服务 1.在服务管理器“角色”右键单击“添加角色”.  2.下一步. 3.勾选“Web 服务器(IIS)”,下一步. 4.勾选“FTP 服务器”,下一步. 5.安装完成,点击“关闭”.  ...

  8. vue仿追书神器,vue小说项目源码

    vue-reader 一点阅读器!API源自追书神器,免费使用!目前已初步开发完成! Github项目地址:https://github.com/AntonySufer/vue-readle 欢迎is ...

  9. 聚合函数:sum,count,max,avg

    聚合函数:sum,count,max,avg等,一般作用于多条记录上.通过group by可以将数据对属于一组的数据起作用. SELECT region, SUM(population), SUM(a ...

  10. Python笔记(六)_函数

    函数一般是从第一行代码开始执行,结束于return语句.异常.或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在局部变量中的数据都将丢失.再次调用这 ...