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

时间:2015-07-31 17:43:52

标签: javascript file download

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

2 个答案:

答案 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长度的限制。