我有以下用于下载文件的 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/