[JS]前端下载的实现

版权声明

本文是在家中思考,查阅互联网开源文献综合实验后得出的,版权:公开

起因

之前一直纠结前端下载是不是触发了浏览器的下载就完成了?后来上网百度了一下,发现并不是的。还是可以追踪到的。

referrer

[1] 用JS在浏览器中创建下载文件
[2] initEvent() 方法
[3] binary-xhr
[4] JS中decodeURI()与decodeURIComponent()区别

思考实现

function download(url) {
  var xhr = new XMLHttpRequest();
  xhr.onprogress = function (ev) {
    console.log('process', ev);
  };
  xhr.onreadystatechange = function () {
    console.log('state:' + xhr.readyState, 'status', xhr.status);
    var fileName = "undefine_file";
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        downloadFile(fileNameFromHeader(xhr.getResponseHeader("Content-Disposition")), xhr.response);
      } else {
        alert('error:' + xhr.status);
      }
    }
  };
  xhr.onerror = xhr.ontimeout = function() {
    console.log('error', arguments);
  };
  xhr.open("get", url, true);
  xhr.responseType = 'arraybuffer';
  xhr.setRequestHeader("Content-Type", "application/octet-stream");
  xhr.send(null);
}

function fileNameFromHeader(disposition) {
  var result = null;
  if (disposition && /filename="(.*?)"/ig.test(disposition)) {
    result = /filename="(.*?)"/ig.exec(disposition);
    return decodeURI(result[1]);
  }
  return "undefine_file";
}

function downloadFile(fileName, content){
    var aLink = document.createElement('a');
    var blob = new Blob([content]);
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("click", false, false);//initEvent 不加后两个参数在FF下会报错, 感谢 Barret Lee 的反馈
    aLink.download = fileName;
    aLink.href = URL.createObjectURL(blob);
    aLink.dispatchEvent(evt);
}

交流

有任何疑问,欢迎留言交流。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值