我目前在Firefox上使用IndexedDB来存储由web worker完成的某些文件处理的输出。我已经设法将完成的文件保存在IndexedDB中作为IDBMutableFile,但是我似乎无法将文件作为blob传输到Web UI,以便用户可以下载它。
当我从数据库中读取文件时,我尝试使用URL.createObjectURL来获取blob:链接,但是当onsuccess处理程序退出时,似乎文件句柄被取消引用(blob不再可通过一个链接)。
我还尝试使用FileReader保持文件句柄处于打开状态,但仍然无效(我得到了FileHandleInactiveError)。
有什么想法吗?唯一有效的方法似乎是将整个文件作为arrayBuffer读取,然后创建一个通过URL.createObjectURL链接的新blob。问题是该文件非常大(1GB)并将整个内容加载到内存中会导致NS_ERROR_OUT_OF_MEMORY异常。
以下是代码:
// Retrieve the file that was just stored
transaction.objectStore("files").get("00b6ac47-7400-4894-8a76-de597c4d7b3e").onsuccess = function (event) {
var fileHandle = event.target.result;
var theFile = fileHandle.getFile();
theFile.onsuccess = function() {
var actualFile = this.result;
// Get window.URL object
var URL = window.URL || window.webkitURL;
var blobUrl = URL.createObjectURL(actualFile);
// Set img src to ObjectURL
var link = document.getElementById("blobLink");
blobLink.setAttribute("href", blobUrl);
//Problem: This link will point to a deleted blob in the UI