html5 ajax文件上传
2016-06-23 16:56
246 查看
<input style="display: none" id="harg_file" type="file" accept="application/zip"/>
$("#harg_file").change(function(){
var fd=new FormData();
fd.append("file",$(this).get(0).files[0])
$.ajax({
url:"/test/upload/",
type:"POST",
processData: false,
contentType:false,
data: fd,
xhr: function() { // custom xhr
myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){ // check if upload property exists
myXhr.upload.addEventListener('progress',function(evt){
$( "#upload_tip").dialog("open");
var percentComplete = Math.round(evt.loaded*100 / evt.total);
console.log(percentComplete);
}, false); // for handling the progress of the upload
}
return myXhr;
},
success:function(data){
console.log("----");
}
});
});
上传文件只能是“POST”提交;processData: false,contentType:false,这两个参数必须有,且必须为false,processData为false代表jquery不会将穿到服务器的data解析为字符串;contentType为false,根据官方文档,这个是一个字符串值,如“application/json”或者“application/x-www-form-urlencoded”之类的。查看jquery源代码
// Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); }
如果contentType为false,则不会为jqXHR设置请求头Content-Type。我猜测XMLHttpRequest在没有Content-Type的情况下,并且发送的数据为FormData对象的话,浏览器会为其生成boundary,默认以multipart/form-data+boundary作为Content-Type。
在用form上传文件时,content-type是multipart/form-data,但这里不能写multipart/form-data,用debug工具查看form上传文件时的content-type,其实真正的值是“multipart/form-data;
boundary=----WebKitFormBoundaryUalLNdJ5BjmXlLhv”,分隔符boundary一般是由浏览器自己产生,最后不要自己手动写。如果我们把contentType的值写成“multipart/form-data; boundary=----WebKitFormBoundaryUalLNdJ5BjmXlLhv”应该也是可以的,但不推荐。
关于XMLHttpRequest和FormData的API可参考 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest https://developer.mozilla.org/zh-CN/docs/Web/API/FormData
相关文章推荐
- HTML5视频播放器<video>和音频播放器<audio>用法
- HTML5 Server-Sent Events with Java Servlets example
- 我的实习之路一
- H5及H5页面是什么意思?如何制作H5页面?
- swiper的基础使用(七)
- HTML5 离线缓存忽略主页实例
- html5培训难不难 前途怎么样
- HTML5页面渲染性能的”程序转换“思路
- HTML5本地存储之Web Storage
- HTML5中使用postMessage实现两个网页间传递数据
- html5新增选择器
- html5_canvas初学
- HTML5 Canvas 逐帧动画的实现
- HTML5部分元素
- HTML5 Canvas彩色小球碰撞运动特效
- 初学HTML5
- swiper的基础使用(十一)
- HTML5:音频控制
- 给H5页面添加百分比的进度条,精确度高
- h5页面适配