Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >下载大型IE11文件时挂起

下载大型IE11文件时挂起
EN

Stack Overflow用户
提问于 2017-09-08 03:29:04
回答 1查看 1.4K关注 0票数 1

对于此代码中的IE11,base64文件被转换为Blob,然后创建一个下载链接。但是,对于一个大型base64文件(~ >5Mb),在创建Blob时浏览器会挂起:

代码语言:javascript
代码运行次数:0
复制
new Blob(byteArrays, {type: contentType});

如何才能解决这个问题呢?

代码语言:javascript
代码运行次数:0
复制
var fullFileName = 'example.test';
var b64file = '';
var contentType = 'application/octet-stream';

b64toBlob(b64file, contentType, 512, function(blob){
  if (typeof MouseEvent != "function") {  //for IE
    $('#ie_download').off('click').on('click', function(){
      window.navigator.msSaveBlob(blob, fullFileName);
    })
      .show();
    success();
    return;
  }
  //other browsers
  var blobUrl = URL.createObjectURL(blob);
  var jqLink = $('<a style="display: none" target="_blank">Save</a>');
  $('#download')
    .attr('download', fullFileName)
    .attr('href', blobUrl)
    .show();
  success();
});

function success () {
  $('#waiting').hide();
}

function b64toBlob(b64Data, contentType, sliceSize, resultCb) {
  contentType = contentType || '';
  sliceSize = sliceSize || 512;

  var byteCharacters = atob(b64Data);
  var byteArrays = [];

  var offset = 0;
  setTimeout(function generateByteArrays () {
    var slice = byteCharacters.slice(offset, offset + sliceSize);
    var byteNumbers = new Array(slice.length);
    for (var i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    var byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);

    offset += sliceSize;
    if (offset < byteCharacters.length) {
      setTimeout(generateByteArrays, 0);
    }
    else {
      resultCb(new Blob(byteArrays, {type: contentType}));
    }
  }, 0);
}
代码语言:javascript
代码运行次数:0
复制
#download, #ie_download {
  display: none;
}
代码语言:javascript
代码运行次数:0
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='waiting'>waiting...</div>
<a id='download'>Save</a>
<a id='ie_download'>IE Save</a>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-08 09:15:32

更新

我刚刚注意到,段大小为512个字节。这是非常小的,并将与一个5 mb文件创建10,240数组片,IE似乎做了一个非常缓慢的操作(即。创建缓冲区、复制内容、检查下一片、创建旧大小和下一片大小的新缓冲区、复制旧缓冲区+新内容等等)。

您应该能够使用至少1000 x更大的片大小(0.5mb),并且不阻塞IE11。

使用具有较大切片大小的原始代码进行演示:

代码语言:javascript
代码运行次数:0
复制
setTimeout(test, 10);

function test() {
  // Generate a big base-64 string, chop off data-uri
  // NOTE: Initial creation will take a couple of seconds...
  var c = document.createElement("canvas"); c.width = c.height = 6000;
  var ctx = c.getContext("2d"); // create some lines to degrade compression ratio...
  for(var i = 0, r = Math.random.bind(Math), w = c.width, h = c.height; i < 500; i++) {
    ctx.moveTo(r()*w, r()*h);ctx.lineTo(r()*w, r()*h);
  }
  ctx.stroke();
  var base64 = c.toDataURL();
  base64 = base64.substr(base64.indexOf(",")+1);

  // OK, now we have a raw base64 string we can use to test
  document.querySelector("out").innerHTML = "Converting...";

  // Increase sliceSize by x1024
  b64toBlob(base64, "application/octet-stream", 512<<10, function(blob) {
    document.querySelector("out").innerHTML = "Blob size: " + blob.size;
  });

  function b64toBlob(b64Data, contentType, sliceSize, resultCb) {
    contentType = contentType || '';
    sliceSize = sliceSize || (512<<10);

    var byteCharacters = atob(b64Data);
    var byteArrays = [];

    var offset = 0;
    setTimeout(function generateByteArrays () {
      var slice = byteCharacters.slice(offset, offset + sliceSize);
      var byteNumbers = new Array(slice.length);
      for (var i = 0; i < slice.length; i++) {
        byteNumbers[i] = slice.charCodeAt(i);
      }
      var byteArray = new Uint8Array(byteNumbers);
      byteArrays.push(byteArray);

      offset += sliceSize;
      if (offset < byteCharacters.length) {
        setTimeout(generateByteArrays, 5);
      }
      else {
        resultCb(new Blob(byteArrays, {type: contentType}));
      }
    }, 5);
  }
}
代码语言:javascript
代码运行次数:0
复制
<out>Creating test data...</out>

由于错误 in IE11,所以不能将XMLHttpRequest()与数据-uri和响应类型"blob“一起使用,否则您可以使用它为您执行所有这些操作。

代码语言:javascript
代码运行次数:0
复制
var c = document.createElement("canvas"); c.width = c.height = 4000;
var ctx = c.getContext("2d"); // create some lines to degrade compression ratio...
for(var i = 0, r = Math.random.bind(Math), w = c.width, h = c.height; i < 200; i++) {
  ctx.moveTo(r()*w, r()*h);ctx.lineTo(r()*w, r()*h);
}
ctx.stroke();
var base64 = c.toDataURL();
base64 = base64.substr(base64.indexOf(",")+1);

b64toBlob(base64, "application/octet-stream", function(blob) {
  console.log(blob)
})

// Using XMLHttpRequest to do the work (won't work in IE11...)
function b64toBlob(base64, mimeType, callback) {
  var xhr = new XMLHttpRequest();
  xhr.responseType = "blob";
  xhr.onload = function() {
    callback(this.response)
  };
  xhr.open("GET", "data:" + mimeType + ";base64," + base64);
  xhr.send();
}

旧答案(仍然适用/推荐)

将超时时间增加到7-10ms,看看是否解除了循环的阻塞(如果仍然阻塞,则使用更高的值)。

超时值为0实际上超出了这种异步分段方法的目的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46115477

复制
相关文章
在OSX上安装和使用ROS
参考链接:https://github.com/mikepurvis/ros-install-osx
zhangrelay
2022/04/29
9710
在OSX上安装和使用ROS
Excel催化剂开源第30波-在Excel上尽情地使用LINQ
对于笔者这样的数据分析工作者来说,对数据库有较深的掌握,当然少不了对SQL查询的深度使用,如果在编程的世界中,可以复用这样的能力,真的是一件多么令人高兴的事情。
Excel催化剂
2021/08/19
1.8K0
pycharm使用pip安装模块时提示: No module named pip
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/174545.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
1.2K0
Mac OSX 上安装yarn
如果从来没改过这个.bash_profile文件(可能会提示你“已锁定”),你可能需要先把这个文件的内容复制到另一个txt(其它类型)文件中,之后:
全栈程序员站长
2022/09/01
1.6K0
Mac OSX 上安装yarn
PROTAC 降解剂化合物库 | MedChemExpress
A1874 是一种以 nutlin 为基础的、BRD4-降解的 PROTAC,DC50 值为 32 nM (诱导细胞内的 BRD4 降解)。有效抑制多种癌细胞增殖。
MedChemExpress
2023/02/27
2230
PROTAC 降解剂化合物库 | MedChemExpress
使用pip安装模块时,提示MemoryError
在使用pip安装依赖模块时,报错如下: 图片 解决方法: 添加 --no-cache-dir参数 pip3 --no-cache-dir install -r *** 安装时遇到的其他问题: 设置python源命令:pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 提示没有config参数; 解决办法:升级pippip3 install -U pip pip install --upgrade pip 提示:E
JQ实验室
2022/11/18
1.6K0
钙通道阻滞剂/拮抗剂的应用 | MedChemExpress
我们都知道钙、钾、钠离子对于维持个体内环境的重要性,离子通道一直是个有趣而复杂的话题。它们就像为某种物质专属定制的“门”或 VIP 通道,不仅分类繁多,还有着严密的“门控”机制。
MedChemExpress
2023/03/06
6040
钙通道阻滞剂/拮抗剂的应用 | MedChemExpress
Install Scrapy on OSX|mac OSX 上安装Scrapy[SYN:gejoin.com]
顺利的话,一句命令搞定: sudo pip install Scrapy OSX还是需要额外一些包或升级的,包括:
gigiwangs
2019/03/01
7930
在Mac OSX下安装和使用GO语言
Go语言是Google新推出的结合了动态语言和静态语言优势的一个新兴的语言。下面介绍一下如何在Mac系统下安装和使用这个语言。
EltonZheng
2021/01/26
1.5K0
DID | 安慰剂检验
简单介绍一下实证论文中双重差分法(DID)的安慰剂检验(Placebo Test)在Stata中如何操作。
kemosabe
2021/08/27
5.5K0
DID  |  安慰剂检验
【业界】世界反兴奋剂机构使用人工智能来识别兴奋剂作弊
AiTechYun 编辑:xiaoshan.xiang Olivier Niggli透露,世界反兴奋剂机构(WADA)正在考虑通过人工智能来帮助该组织在运动员数据中发现违规行为 WADA计划在其反兴奋
AiTechYun
2018/03/27
5490
【业界】世界反兴奋剂机构使用人工智能来识别兴奋剂作弊
Excel催化剂开源第29波-在Winform上使用富文本编辑器控件
富文本编辑器,一般都是BS架构专利一般,好像百度有一个开源的比较出名,但无奈这些都只能用在JS上,在BS网页端开发上使用。像Winform开发的VSTO,只能羡慕的份。和一般Winform上用的RichText控件,别人BS的富文本编辑器就强大得多。
Excel催化剂
2021/08/19
9660
在Pycharm安装库时,报错提示:python中的pip版本过低。「建议收藏」
但是在执行更新pip指令:python -m pip install --upgrade pip后。 直接在cmd中输入指令后,显示:在anaconda中的pip版本已经是最高了。
全栈程序员站长
2022/09/28
2.3K0
在Pycharm安装库时,报错提示:python中的pip版本过低。「建议收藏」
李伟坚(Excel催化剂):带你全面认识《Excel催化剂》系列功能
本次要介绍的是一款名叫《Excel催化剂》的 Excel 插件,也是目前国内技术含最高的 Excel 插件,共计80大类300个细分功能、180个自定义函数,涉及人工智能、数据库、powerbi 等诸多高大上的内容,让Excel的能力边界得到前所未有的扩展。
寒树Office与RPA
2019/11/29
3.4K0
openwrt 上python pip 安装
一,首先安装python2.7 opkg update opkg install python 二,然后从官网上下载pip安装脚本,注意加上–no-check-certificate wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 三,直接运行 get-pip.py python get-pip.py image.png
qinyang
2018/06/05
7.7K0
在提取 Docker 映像时解决“未找到清单”错误
如果您尝试拉取 Docker 映像并且它显示未找到清单错误,那么您需要了解如何解决它。
网络技术联盟站
2022/03/21
1.5K0
在提取 Docker 映像时解决“未找到清单”错误
个人永久性免费-Excel催化剂功能第18波-在Excel上也能玩上词云图
原文在简书上发表,再同步到Excel催化剂微信公众号或其他平台上,文章后续有修改和更新将在简书上操作, 其他平台不作同步修改更新,因此建议阅读其他出处的文章时,尽可能跳转回简书平台上查看。
Excel催化剂
2021/08/19
3650
用科创板给国产中间件打上一剂兴奋剂!
一波三折后,中创软件商用中间件股份有限公司(下称“中创软件”)正稳步推进上市进程,目前已经通过上市委会议。
数据猿
2023/03/03
3580
用科创板给国产中间件打上一剂兴奋剂!
业务安全-DevSecOps 的催化剂
前言 DevSecOps的困境 产品鄙视研发,研发又鄙视运维,运维呢又鄙视安全。 业务和产品说:不是我设计这么好的业务产品,你研发再牛也没用,测试、运维、安全都是我养的。 研发说:要不是我研发这么牛的
DevOps时代
2018/02/02
9010
业务安全-DevSecOps 的催化剂
python使用pip卸载和安装库「建议收藏」
问题出在哪呢?细心的同学会问了。其实呢,pip虽然是python的自带工具,而且安装了python之后会自动安装上pip,但pip工具并不能在python中打开哦! 下面我们演示如何在命令行中退出python,之后打开pip:
全栈程序员站长
2022/11/02
1.5K0

相似问题

如何在CentOS中安装紧缩剂?

15

其他语言的紧缩剂

14

在OSX上安装Typesafe活化剂

69

在Windows上安装php增强剂时遇到的困难

23

DataNucleus增强剂flakey?

512
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文