你把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。