后面有boundary以及一串字符,这是分界符,后面的一堆字符串是随机生成的,目的是防止上传文件中出现分界符导致服务器无法正确识别文件起始位置(因为对于上传文件,我们没有在使用原有的 http 协议,所以 multipart/form-data 请求是基于 http 原有的请求方式 post 而来的).
与post区别
(1)请求头的不同,对于上传文件的请求,contentType = multipart/form-data是必须的,而 post 则不是,毕竟 post 又不是只上传文件
(2)请求体不同。这里的不同也就是指前者在发送的每个字段内容之间必须要使用分界符来隔开,比如文件的内容和文本的内容就需要分隔开,不然服务器就没有办法正常的解析文件,而后者 post 当然就没有分界符直接以 name = "value"的形似发送。
不过传统的form表单提交会导致页面刷新,但是在有些情况下,我们不希望页面被刷新,用ajax
ajax
$.ajax({
url : "http://localhost:8080/STS/rest/user",
type : "POST",
data : $( '#postForm').serialize(), //对form表单进行序列化,从而将form表单中的所有参数传递到服务端。
success : function(data) {
$( '#serverResponse').html(data);
},
error : function(data) {
$( '#serverResponse').html(data.status + " : " + data.statusText + " : " + data.responseText);
}
});
Mozilla上的介绍的,XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过方法来异步的提交这个”表单”.比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件.
所有主流浏览器的较新版本都已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+。之前都是用原生js的XMLHttpRequest写的请求
2、XMLHttpRequest方式
var oData = new FormData(document.forms.namedItem("fileinfo" ));
oData.append( "CustomField", "This is some extra data" );
var oReq = new XMLHttpRequest();
oReq.open( "POST", "stash.php" , true );
oReq.onload = function(oEvent) {
if (oReq.status == 200) {
oOutput.innerHTML = "Uploaded!" ;
} else {
oOutput.innerHTML = "Error " + oReq.status + " occurred uploading your file.";
}
};
oReq.send(oData);
2、ajax方式(关键是设置:processData 和 contentType )
var formData = new FormData();
var name = $("input").val();
formData.append("file",$("#upload")[0].files[0]);
formData.append("name",name);
$.ajax({
url : Url,
type : 'POST',
data : formData,
// 告诉jQuery不要去处理发送的数据,用于对data参数进行序列化处理 这里必须false
processData : false,
// 告诉jQuery不要去设置Content-Type请求头
contentType : false, //必须
beforeSend:function(){
console.log("正在进行,请稍候");
},
success : function(responseStr) {
if(responseStr.status===0){
console.log("成功"+responseStr);
}else{
console.log("失败");
}
},
error : function(responseStr) {
console.log("error");
}
});
或
function (iFileID, iUrlInputID) {
if ($(iFileID).val() == "") {
$.messager.alert("错误", "请选择要上传的文件!", "error");
return false;
}
var myFormData = new FormData();
myFormData.append("upfile", $(iFileID).get(0).files[0]);
$.ajax({
type: "post",
url: configInfo.apiRoot + "files", //请求url
processData: false,
contentType: false,
data: myFormData,
success: function (data) {
// 将文件url放到隐藏的输入框里
$(iUrlInputID).val(data);
$.messager.alert("信息", "上传文件成功!", "info");
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
// 失败
$.messager.alert("错误", "上传文件失败!", "error");
}
});
}
在 JQuery ajax() 方法中设置contentType = false,不冲突。因为当查看这时的 Request headers,会发现还是有分界符。因为当我们在 form 标签中设置了enctype = “multipart/form-data”,这样请求中的 contentType 就会默认为 multipart/form-data 。而在 ajax 中 contentType 设置为 false 是为了避免 JQuery 对其操作,从而失去分界符,而使服务器不能正常解析文件。
web.config中添加如下节点