您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
一位不愿透露姓名的用户 发布于2019年05月21日 16:32

AJAX异步上传文件报错:the request was rejected because no multipart boundary was found

8278 次浏览 读完需要≈ 3 分钟 jQueryJavaScriptSpring MVC

各位大神,当我使用jQuery AJAX进行异步上传文件时,后台 Spring MVC 控制器给我报错如下:

Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found.

以下是相关的代码片段:

$('#fileUpload').on('change', function(){
	if(!this.value) return;
	var formData = new FormData();
	formData.append(this.name, this.files[0]);
	$.ajax({
		type: 'POST',
		url: '/file/upload',
		dataType: 'json',
		data: formData,
		processData: false,
		contentType: 'multipart/form-data',
		success: function(json){
			console.log(json);
		},
		error: function (jqXHR, textStatus, errorMsg) {
			// ignore
		}
	});
});
/**
 * 上传文件
 */
@PostMapping("/file/upload")
public String upload(MultipartFile file) {
	// 还没进入下面的代码就报错了
}

环境信息

  • jQuery 1.11.1
  • 浏览器:Chrome 69
  • 后台 Spring MVC 4.3.18.RELEASE

1 个回答

Ready · 5年前

你把contentType: 'multipart/form-data'改为contentType: false

说明

大家都知道,在使用form表单上传文件时,确实是需要把表单的enctype改为multipart/form-data的。

因为,当我们使用HTTP form表单进行文件上传时,请求数据实际上根据参数分片封装的,大致的数据格式如下:

-----------------------------12286132066936
Content-Disposition: form-data; name="file1"; filename="1.png"
Content-Type: image/png // 这里是文件1的二进制数据... -----------------------------12286132066936 Content-Disposition: form-data; name="file2"; filename="2.png" Content-Type: image/png // 这里是文件2的二进制数据 -----------------------------12286132066936 Content-Disposition: form-data; name="hello" 这里是附加的文本参数数据 -----------------------------12286132066936--

此时,我们发送HTTP请求的请求头Content-Type其实际的值为:

multipart/form-data; boundary=---------------------------12286132066936

可以看到,在"multipart/form-data"后面附带了一个boundary属性。大家应该能够猜到:这个boundary的值就是请求数据中的分隔符,服务器就是根据这个分隔符,将数据拆分为多个参数,然后分别解析其数据的。

当使用form表单进行文件上传时,浏览器会自动为我们附加这个boundary属性。

不过,在使用jQuery AJAX异步上传的时候,我们却不能手动将其设置为multipart/form-data,因为一旦我们设置了该属性,浏览器和jQuery将不会再为我们自动附加这个boundary

在使用jQuery进行AJAX异步上传时,这个参数也不能缺省(使用默认值),因为jQuery 中,contentType属性的默认值为application/x-www-form-urlencoded; charset=UTF-8

已采纳 83 3 0 0 编辑

撰写答案