为了账号安全,请及时绑定邮箱和手机立即绑定

[Javascript]XMLHttpRequest对象实现下载进度条

标签:
JavaScript

摘要

可以通过设置一个XMLHttpRequest对象的responseType属性来改变一个从服务器上返回的响应的数据类型。可用的属性值为空字符串 (默认), "arraybuffer", "blob", "document", 和 "text". response属性的值会根据responseType属性的值的不同而不同, 可能会是一个 ArrayBuffer, Blob, Document, string,或者为NULL(如果请求未完成或失败)。

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

它分成上传和下载两种情况。下载的progress事件属于XMLHttpRequest对象,上传的progress事件属于XMLHttpRequest.upload对象。

一个例子

服务端以一个一般处理程序来处理下载的请求。


   /// <summary>
   /// download 的摘要说明    /// </summary>
   public class download : IHttpHandler
   {        public void ProcessRequest(HttpContext context)
       {            string fileName = "1.docx";//客户端保存的文件名
           string filePath = context.Server.MapPath("~/file/" + fileName);//路径            //以字符流的形式下载文件
           FileStream fs = new FileStream(filePath, FileMode.Open);            byte[] bytes = new byte[(int)fs.Length];
           fs.Read(bytes, 0, bytes.Length);
           fs.Close();
           context.Response.ContentType = "application/octet-stream";            //通知浏览器下载文件而不是打开        
           context.Response.AddHeader("Content-Length", bytes.Length.ToString());
           context.Response.AddHeader("Content-Transfer-Encoding", "Binary");
           context.Response.AddHeader("Content-Disposition", "attachment; filename=" +
               HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
           context.Response.BinaryWrite(bytes);
           context.Response.Flush();
           context.Response.End();
       }        public bool IsReusable
       {            get
           {                return false;
           }
       }
   }


js


<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="jquery-2.1.1.min.js"></script>
   <title></title></head><body>

   <div id="a1" data-filename="1.docx">下载</div>
   <div id="progressing"></div>
   <script>
       $('#a1').click(function () {            var that = this;            var page_url = 'download.ashx';            var req = new XMLHttpRequest();
           req.open("POST", page_url, true);            //监听进度事件            req.addEventListener("progress", function (evt) {                if (evt.lengthComputable) {                    var percentComplete = evt.loaded / evt.total;
                   console.log(percentComplete);
                   $("#progressing").html((percentComplete * 100) + "%");
               }
           }, false);

           req.responseType = "blob";
           req.onreadystatechange = function () {                if (req.readyState === 4 && req.status === 200) {                    var filename = $(that).data('filename');                    if (typeof window.chrome !== 'undefined') {                        // Chrome version
                       var link = document.createElement('a');
                       link.href = window.URL.createObjectURL(req.response);
                       link.download = filename;
                       link.click();
                   } else if (typeof window.navigator.msSaveBlob !== 'undefined') {                        // IE version
                       var blob = new Blob([req.response], { type: 'application/force-download' });
                       window.navigator.msSaveBlob(blob, filename);
                   } else {                        // Firefox version
                       var file = new File([req.response], filename, { type: 'application/force-download' });
                       window.open(URL.createObjectURL(file));
                   }
               }
           };
           req.send();
       });    </script></body></html>


测试

XMLHttpRequest Level 2 使用指南

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消