zoukankan      html  css  js  c++  java
  • ajax下载小于500M大文件【原】

    不推荐使用的FileReader

    之前用FileReader读取下载文件,当文件超过1M浏览器就立即扑街了

            // 文件下载
            function download(blob, fileName) {
              var reader = new FileReader();
              reader.readAsDataURL(blob);
              reader.onload = function (e) {
                //创建a标签,构造下载弹窗
                var a = document.createElement("a");
                a.id = "downloadTag";
                a.download = fileName;
                a.href = e.target.result;
                $("body").append(a);
                a.click();
                $("#downloadTag").remove();
                console.log("下载完成!");
              }
    
            }

    blob方式推荐

     于是在网上找到另一种Blob读取方式

    核心代码 

    var blob=new Blob([xhrRequest.response], {type: 'application/octet-binary'});
    var link=document.createElement('a');
    link.href=window.URL.createObjectURL(blob);
    link.download="myFileName.zip"; link.click();

    完整代码

    request.js

         /**
           * 通用下載文件方法
           * @param {url, data} config 
           */
          fileDownload: function (config) {
    
            tool.loading()
    
            var xhrRequest = xhr(config.url);
    
            xhrRequest.addEventListener("load", function (data) {
              config.complete && config.complete(data)
            }, false);
            xhrRequest.addEventListener("error", function (data) {
              tool.loading('close')
            }, false);
    
            xhrRequest.onload = function (data) {
              if (this.status === 200) {
                var blob = new Blob([xhrRequest.response], { type: 'application/octet-binary' });
    
                var contentDisposition = this.getResponseHeader('Content-Disposition');
                var fileName = contentDisposition.split('=')[1];
                download(blob, fileName)
                tool.loading('close')
              }
            }
    
            // 发送请求
            xhrRequest.send(JSON.stringify(config.data));
    
            // 文件下载
            function download(blob, fileName) {
              var link = document.createElement('a');
              link.href = window.URL.createObjectURL(blob);
              link.download = fileName;
              link.click();
              link.remove();
    
              // var reader = new FileReader();
              // reader.readAsDataURL(blob);
              // reader.onload = function (e) {
              //   //创建a标签,构造下载弹窗
              //   var a = document.createElement("a");
              //   a.id = "downloadTag";
              //   a.download = fileName;
              //   a.href = e.target.result;
              //   $("body").append(a);
              //   a.click();
              //   $("#downloadTag").remove();
              //   console.log("下载完成!");
              // }
    
            }
    
            // request
            function xhr(url) {
              var xhr = new XMLHttpRequest();
              xhr.open('POST', url, true);
              xhr.responseType = "blob";
              xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
              xhr.setRequestHeader('token', storage.get('token'))
    
              return xhr
            }
          }
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Qt 自定义model实现文件系统的文件名排序
  • 原文地址:https://www.cnblogs.com/whatlonelytear/p/11613239.html
Copyright © 2011-2022 走看看