XMLHTTPREQUEST–获取上传文件的进度

最近做了一个项目,其中一个需求是显示文件上传进度。由于对XMLHttpRequest对象的了解不够,以至于浪费了很多时间。今天主要来说一下XMLHttpRequest对象中获取文件上传进度的方法,
代码如下:

<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这个函数只要调用一下就能取消上传

拓展:既然XMLHttpRequest对象可以获取上传进度,当然也可以或许下载进度。需要注意的是,上传过程和下载过程触发的是不同对象的onprogress事件:
① 上传触发的是xhr.upload对象的 onprogress事件
② 下载触发的是xhr对象的onprogress事件

posted @ 2017-09-12 15:31  ........lhh  阅读(1758)  评论(0编辑  收藏  举报