我正在编写一个Web应用程序,它会生成一个潜在的大型文本文件供用户下载,并且所有处理都在浏览器中完成。到目前为止,我能够以小块读取超过1 GB的文件,处理每个块,逐步生成一个大输出文件,并在IndexedDB中存储不断增长的输出。我的更加天真的尝试是将所有结果保存在内存中,然后在最后一刻将它们序列化到文件中,这导致所有浏览器都崩溃了。
我的问题有两个方面:
我可以在没有先将整个条目读入内存的情况下向IndexedDB中的一个条目(字符串或数组)追加内容吗?现在,这样做:
task.dbInputWriteQueue.push(output); var transaction = db.transaction("files", "readwrite"); var objectStore = transaction.objectStore("files"); var request = objectStore.get(file.id); request.onsuccess = function() { request.results += nextPartOfOutput objectStore.put(request.results); };
当输出内容变得很大时,会导致崩溃。我可以将一堆小条目写入数据库,但是后来我仍然需要将它们全部读入内存才能连接它们。请参见我的问题的第二部分...
对于 IndexedDB 中的值,我是否可以创建一个数据对象 URL 来引用它,而不必将该值加载到内存中? 对于小字符串,我可以这样做:
var url = window.URL.createObjectURL(new Blob([myString]), {type: 'text/plain'});
但对于大字符串来说,这个方法就不太适用了。事实上,在字符串加载之前程序就会崩溃。似乎使用 IndexedDB 的
get()
进行大读取(即使是开发者工具)会导致至少 Chrome 崩溃。
如果我使用 Blob 而不是字符串,会更快吗?这个转换是否廉价?
基本上,我需要一种用 JavaScript 将一个非常大的文件写入磁盘而不必在任何时间点将整个文件加载到内存中的方法。我知道可以给 createObjectURL
传递一个 File,但在我的情况下,那并不起作用,因为我正在从用户提供的文件中生成一个新文件。
POST
而不是GET
进行发布,因为POST
允许发送更多数据。 - Agi Hammerthief