最近作了一个项目,其中一个需求是显示文件上传进度。因为对XMLHttpRequest对象的了解不够,以致于浪费了不少时间。今天主要来讲一下XMLHttpRequest对象中获取文件上传进度的方法,
代码以下:javascript
<input type="file" name="fileUpload" id="fileUpload" onchange="Upload();"/>
function Upload() { //获取上传文件 var file = document.getElementById('fileUpload').files[0]; //建立表单数据 var formData = new FormData(); formData.append('file', file); //建立xhr对象 var xhr = new XMLHttpRequest(); xhr.open('POST', '请求路径', true); xhr.onload = uploadCom; //请求完成 xhr.onerror = uploadFail; //请求失败 xhr.upload.onprogress = progressFunction;//上传进度调用方法实现 xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { let body = JSON.parse(xhr.responseText); let data= body.data; self.setState({'to_user_arr':data}) }else{ try{ let msg = JSON.parse(xhr.responseText)["msg"]; message.error(msg,10); }catch(e){} } } }; } function progressFunction(evt) { // evt.total是须要传输的总字节,evt.loaded是已经传输的字节。若是evt.lengthComputable不为真,则evt.total等于0 if (evt.lengthComputable) {// console.log('当前上传进度'+Math.round(evt.loaded / evt.total * 100) + "%") } } //上传成功响应 function uploadCom(evt) { //服务断接收完文件返回的结果 alert("上传成功!"); } //上传失败 function uploadFail(evt) { alert("上传失败!"); } //取消上传 function cancleUpload(){ xhr.abort(); }
XMLHttpRequest对象,传送数据的时候,有一个onprogress事件,用来返回进度信息。咱们能够经过onprogress事件来实时显示进度,默认状况下这个事件每50ms触发一次。
progressFunction函数中:
1.total - 总的字节数
2.loaded - 到目前为止上传的字节数
3.lengthComputable - 可计算的已上传字节
注:cancleUpload这个函数只要调用一下就能取消上传html
拓展:既然XMLHttpRequest对象能够获取上传进度,固然也能够或许下载进度。须要注意的是,上传过程和下载过程触发的是不一样对象的onprogress事件:
① 上传触发的是xhr.upload对象的 onprogress事件
② 下载触发的是xhr对象的onprogress事件java