我有以下用于下载文件的JavaScript代码,我不禁想到我从这里开始:Create a file in memory for user to download, not through server
然而,此功能在Chrome中崩溃,因为我正在尝试下载太多数据(可能是几MB,但对于1 MB以下的下载似乎可以正常工作。我没有对它做过很多指标)。
我真的很喜欢这个函数,因为它允许我从现有的巨大JavaScript变量创建一个字符串并立即下载它。
那么我的两个问题是:
A)造成撞车的原因是什么?它是字符串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);
}
的大小还是这个函数中有什么东西?我读到在JavaScript中可以使用60MB的字符串,我认为我没有达到这个目标。
B)如果是这个功能,还有另一种简单的方法可以下载一些巨大的文件,允许我通过JavaScript在本地生成内容吗?
X.class
答案 0 :(得分:2)
它在其他浏览器中有效吗?尝试使用调试器并在函数内部设置断点并逐步执行。
尝试通过创建一个包含您要设置为href的字符串的var来分解element.setAttribute
和数据内容,这样就可以看到更多的失败点。
查看encodeURIComponent
函数是否因大字符串而失败。
字符串在javascript中是不可变的,对于那些知道它们的人来说意味着他们的创建是最终的,你不能修改字符串,或者附加到字符串,你必须为每次更改创建一个新字符串。 url对字符串进行编码的encodeURIComponent
可能会使数千个更改转义为> 1mb字符串取决于字符串的内容。即使您使用需要转义的零字符,当您调用该函数然后将其附加到'data:text/plain;charset=utf-8,'
字符串时,它将从这两个字符串创建一个新字符串,有效地将该操作所需的内存加倍。 / p>
根据特定浏览器处理此功能的方式,它根本没有针对长字符串进行优化,因为大多数浏览器的网址字符限制为~2000个字符(通常为2048),那么浏览器中的实现很可能不是做一个低级逃脱。如果这个功能确实是罪魁祸首,你必须找到另一种方法来逃避你的字符串。可能是图书馆或自定义低级逃生。
如果调试器显示此功能不是问题,那么明显的其他瓶颈就是当你将这个巨大的链接附加到dom时,浏览器可能会冻结那里试图处理这个命令,为此它可能需要一个完全不同的下载问题解决方案。
虽然这只是猜测,但希望它能引导你走向正确的方向。
答案 1 :(得分:2)
虽然我将Rickey的答案标记为正确答案,因为它让我得到了正确的答案,我找到的解决方法就是:
JavaScript blob filename without link
此链接上接受的答案能够处理超过8MB,而数据URI能够处理2MB,因为Chrome对URI长度的限制。