indexedDB的每条记录大小限制是多少?

10

我正在为HTML5构建一个文件存储系统,使用indexedDB作为存储介质,通过xmlHttpRequest请求将响应类型设置为arrayBuffer(对于chrome)和blob(对于其他浏览器)从服务器请求文件。

即使文件集合大小为500MB或更大,一切都正常(嘿,它甚至可以达到GB级别)。但是当我将文件添加到indexedDB中时,如果单个文件超过约120MB,就会触发错误,因此无法存储。但是如果文件小于120MB,则会存储该文件。

请注意,仅在存储单个文件> 120MB时才会出现此错误,例如,200MB的.mp4文件将触发错误,但如果我有5个视频,每个视频的大小为100MB(因此总计为500MB),则一切都很好。

我想知道这是否是限制规则还是某些故障,并且两者是否具有相同的错误。我没有找到任何文档关于此问题。我在IE和Chrome中进行了测试。

编辑: 好的,当我存储文件时,显然在indexedDB的添加或put函数中出现了此错误:

在e.target.error.message中:

序列化值太大(大小为140989466字节,最大为133169152字节)


为什么要将文件存储在数据库中?数据库绝对不适合文件存储,尤其是大文件。 - Cerbrus
这些是动态文件,因此无法进行缓存清单。WebSQL 已不再开发,文件系统 API 仅在 Chrome 上可用。 - Eldon Lesley
6
可能这个人正在使用IndexedDB存储文件,因为除了在IndexedDB中没有其他地方可以存储它们(将数据传输到服务器并不总是可行或甚至是可取的)。由于Mozilla和W3C对Chrome HTML5文件系统提出的建议不感兴趣,而是主张使用IndexedDB,他们应该预计开发人员会尝试使用IndexedDB存储大量数据,因此应该能够这样做,而不会遇到迫使开发人员在IndexedDB上构建hack以处理限制的任意限制。 - Eric
1
我们也遇到了同样的问题。我们需要使用IndexedDB支持离线场景。我们需要将一些文件离线存储,因此必须存储在IndexedDB中。这个max=133169152字节是在Chrome中硬编码的吗? - Joy George Kunjikkuru
1
这个问题在我搜索同样的问题时刚刚出现。我需要在idb中离线存储用户视频捕获。我认为@Eric有一个有效的观点,由于idb强加的大小限制,没有存储选项,程序员不得不进行hacky编码来解决相当简单的问题。 - Philip Attisano
2个回答

2
当提出这个问题时,Chrome还不支持将Blob保存到IndexedDB中,直到下个月才支持
对于现在遇到同样问题的人,直接存储Blobs或文件,而不是ArrayBuffers。
与ArrayBuffers相反,将Blob保存到IDB不需要序列化其数据,Blob的序列化步骤只是为了对js对象进行快照,并保留到同一底层字节序列的链接,本身并没有克隆。您应该面临的唯一限制是数据库本身的限制
从Chrome的公告中提取的代码:
var store = db.transaction(['entries'], 'readwrite').objectStore('entries');

// Store the object  
var req = store.put(blob, 'blob');
req.onerror = function(e) {
    console.log(e);
};
req.onsuccess = function(event) {
    console.log('Successfully stored a blob as Blob.');
};

0

我认为这是您的浏览器在IndexedDB实现方面存在问题。当我尝试将一个100 MB的文件存储到IndexedDB记录中时,我在Firefox中遇到了同样的错误,但相同的代码在Chrome中运行良好。看来不同的浏览器有不同的实现怪癖和限制。

个人而言,我怀疑这是Firefox的一个bug,因为Firefox授予了请求的大小,但随后阻止了整个大小的单记录使用,而Chrome则更加宽容。


你试图存储什么类型的对象?Blob / File还是ArrayBuffer? - Kaiido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接