首页 > 代码库 > js 文件上传进度条

js 文件上传进度条

<!DOCTYPE html><html><head><meta charset="UTF-8">    <title>XMLHttpRequest上传文件进度实现</title>    <script type="text/javascript">        var xhr;        var ot;//        var oloaded;        //上传文件方法        function UpladFile() {            var fileObj = document.getElementById("file").files[0]; // js 获取文件对象            var url = "uploadFile"; // 接收上传文件的后台地址                         var form = new FormData(); // FormData 对象            form.append("mf", fileObj); // 文件对象                        xhr = new XMLHttpRequest();  // XMLHttpRequest 对象            xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。            xhr.onload = uploadComplete; //请求完成            xhr.onerror =  uploadFailed; //请求失败            xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】            xhr.upload.onloadstart = function(){//上传开始执行方法                ot = new Date().getTime();   //设置上传开始时间                oloaded = 0;//设置上传开始时,以上传的文件大小为0            };            xhr.send(form); //开始上传,发送form数据        }        //上传进度实现方法,上传过程中会频繁调用该方法        function progressFunction(evt) {                         var progressBar = document.getElementById("progressBar");             var percentageDiv = document.getElementById("percentage");             // event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0             if (evt.lengthComputable) {//                 progressBar.max = evt.total;                 progressBar.value = http://www.mamicode.com/evt.loaded;"%";             }                        var time = document.getElementById("time");            var nt = new Date().getTime();//获取当前时间            var pertime = (nt-ot)/1000; //计算出上次调用该方法时到现在的时间差,单位为s            ot = new Date().getTime(); //重新赋值时间,用于下次计算                        var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位b                   oloaded = evt.loaded;//重新赋值已上传文件大小,用以下次计算                    //上传速度计算            var speed = perload/pertime;//单位b/s            var bspeed = speed;            var units = ‘b/s‘;//单位名称            if(speed/1024>1){                speed = speed/1024;                units = ‘k/s‘;            }            if(speed/1024>1){                speed = speed/1024;                units = ‘M/s‘;            }            speed = speed.toFixed(1);            //剩余时间            var resttime = ((evt.total-evt.loaded)/bspeed).toFixed(1);            time.innerHTML = ‘,速度:‘+speed+units+‘,剩余时间:‘+resttime+‘s‘;               if(bspeed==0)                time.innerHTML = ‘上传已取消‘;        }        //上传成功响应        function uploadComplete(evt) {         //服务断接收完文件返回的结果         //    alert(evt.target.responseText);             alert("上传成功!");        }        //上传失败        function uploadFailed(evt) {            alert("上传失败!");        }          //取消上传        function cancleUploadFile(){            xhr.abort();        }    </script></head><body>    <progress id="progressBar" value="http://www.mamicode.com/0" max="100" style="width: 300px;"></progress>    <span id="percentage"></span><span id="time"></span>    <br /><br />    <input type="file" id="file" name="myfile" />    <input type="button" onclick="UpladFile()" value="http://www.mamicode.com/上传" />    <input type="button" onclick="cancleUploadFile()" value="http://www.mamicode.com/取消" /></body></html>

若想用jQuery 中的ajax实现的话,jQuery的 ajax 方法没有关于 progress 事件的操作,此时需要调用的XMLHttpRequest对象是指定progress 事件。

$.ajax({    type: "POST",  url: "upload",  data: formData ,  //这里上传的数据使用了formData 对象  processData : false,   //必须false才会自动加上正确的Content-Type   contentType : false ,       //这里我们先拿到jQuery产生的 XMLHttpRequest对象,为其增加 progress 事件绑定,然后再返回交给ajax使用  xhr: function(){    var xhr = $.ajaxSettings.xhr();    if(onprogress && xhr.upload) {      xhr.upload.onprogress = progressFunction;
      return xhr;
    }
  }
});

 

XMLHttpRequest对象,传送数据的时候,有一个progress事件,用来返回进度信息。

它分成上传和下载两种情况

1)下载的progress事件属于XMLHttpRequest对象

2)上传的progress事件属于XMLHttpRequest.upload对象。

下载进度实现:
xhr.onprogress = downloadProgress;function downloadProgress(event) {//未测试    if(event.lengthComputable) {        var percentComplete = event.loaded / event.total;     }}

js 文件上传进度条