javascript - 在本地生成和下载一个大文件

标签 javascript file download

我有以下用于下载文件的 JavaScript 代码,我忍不住认为我是从这里获得的:Create a file in memory for user to download, not through server

但是,这个函数在 Chrome 中崩溃了,因为我试图下载太多数据(它可能是几 MB,但它似乎适用于 1 MB 以下的下载。我没有对它做很多指标).

我真的很喜欢这个函数,因为它让我可以从现有的巨大 JavaScript 变量创建一个字符串并立即下载它。

那么我的两个问题是:

A) 是什么导致了崩溃?是字符串 text 的大小还是这个函数中有什么?我读到 60MB 的字符串在 JavaScript 中是可能的,但我认为我还没有完全达到这个目标。

B) 如果是这个函数,是否有另一种简单的方法来下载一些巨大的文件,允许我通过 JavaScript 在本地生成内容?

function download(filename, text) {
  var element = document.createElement('a');
  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  element.setAttribute('download', filename);

  element.style.display = 'none';
  document.body.appendChild(element);
  element.click();
  document.body.removeChild(element);
}

最佳答案

它在其他浏览器中工作吗?尝试使用调试器并在函数内部设置断点并单步执行。

尝试通过创建一个包含要设置为 href 的字符串的 var 来分解 element.setAttribute 和数据内容,这样您可以看到更多失败点。

查看 encodeURIComponent 函数是否因大字符串而失败。

字符串在 javascript 中是不可变的,对于那些知道的人来说,这意味着它们的创建是最终的,您不能修改字符串,也不能附加到一个字符串,您必须为每次更改创建一个新字符串。 encodeURIComponent url 对字符串进行编码可能会根据字符串的内容进行数千次更改以转义 > 1mb 的字符串。即使您使用需要转义的零个字符,当您调用该函数然后将其附加到 'data:text/plain;charset=utf-8,' 字符串时,它也会创建一个来自这两个的新字符串,有效地加倍了该操作所需的内存。

根据特定浏览器处理此功能的方式,它根本没有针对长字符串进行优化,因为大多数浏览器的 url 字符限制为 ~2000 个字符(通常为 2048 个字符),因此浏览器中的实现很可能不是进行低级逃生。如果这个函数确实是罪魁祸首,你将不得不找到另一种方法来 uri 转义你的字符串。可能是库或自定义低级别转义。

如果调试器显示这个函数不是问题,那么另一个明显的瓶颈是当你将这个巨大的链接附加到 dom 时,浏览器可能会卡住在那里试图处理这个命令,为此它可能需要一个下载问题的完全不同的解决方案。

虽然这只是猜测,但希望它能引导您朝着正确的方向前进。

关于javascript - 在本地生成和下载一个大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31752118/

相关文章:

java - 用逗号显示下载文件的百分比

python - 带大文件的flask make_response

javascript - 如何从多个主机加载Polymer组件?

javascript - 在另一个指令中重用指令函数

javascript - 打开带有多个标记的 Google map 链接

c - 如何动态创建结构数组并将数据存储在文件中

javascript - 当以编程方式切换 prop "checked"时,复选框不会在视觉上更新

file - 按批处理文件中的名称排序

c 函数 fprintf 变量文件指针

jQuery 文档准备就绪事件