假设form表单中有上传文件的输入框,参考形式:
<form method="post" onsubmit="return uploadAction(this);"> <div class="avatar-add"> <p>建议尺寸168*168,支持jpg、png、gif,最大不能超过2M</p> <div class="file-style"><input type="file" name="photo" id="upload-image" accept="image/*"></div> </div> <div class="layui-form-item"><button class="layui-btn" type="submit" >上传</button></div> </form>
uploadAction是上传提交触发的js函数,它的内容参考:
var hasRequest = false;
function uploadAction(dom){
if(typeof FormData == 'undefined'){
//(1)jQuery ajax上传文件,依赖FormData对象,为了友好展示,在JS函数中需要做下判断,因为不是所有浏览器都支持FormData对象。
alert( "当前浏览器不支持FormData对象,请使用非IE内核或IE10+的浏览器上传文件");
return false;
}
//(2)把form表单的DOM对象在实例化FormData对象时传入【也可以不传入】,这样就可以把from表单中的所有参数字段添加到FromData对象里。后面可以使用FormData对象的append方法添加其他的需要上传的参数。
var formData = new FormData(dom);
//formData.append('action_type',4);
//formData.append('__token__',token);
if(hasRequest) return false;//已经有事件请求了
hasRequest = true;
$.ajax({
type:'post',
url:url,
data:formData,//(3)在没有文件上传时,通常是用serialize()方法
processData: false,
contentType: false,
beforSend:function(){
},
error: function (jqXHR, textStatus, errorThrown) {
hasRequest = false;
alert( '系统异常,请稍后再试' );
return false;
},
success:function(res){
if(res.status){
alert('成功');
}else{
alert('失败');
}
hasRequest = false;
}
});
return false;//阻止默认动作
}使用jQuery ajax上传文件与普通的ajax提交数据不同之处在于需要专门设置两个参数:
processData: false, contentType: false,
(默认: true) 默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
如果我们不把processData设置为false,data数据就会被序列化处理,这样就会报错:

(默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数情况。如果你明确地传递了一个content-type给 $.ajax() 那么他必定会发送给服务器(即使没有数据要发送)
"application/x-www-form-urlencoded"默认值不适合文件上传提交,不需要设置请求头。