我正在为HTML5构建文件存储,我使用indexedDB作为存储,我通过xmlHttpRequest从服务器询问文件,响应类型为arrayBuffer(对于chrome)和blob(对于其他浏览器)。
即使文件集合大小为500MB或更多,一切都很好,(嘿,它甚至可以达到GB)。但是当我将文件添加到indexedDB时,我注意到一些奇怪的事情,当单个文件超过~120MB时,它会触发错误,因此不会存储。但是当文件小于120MB时,它将存储它。
请注意,存储单个文件时只会出现此错误> 120MB,例如,一个200MB的.mp4文件会触发错误,但是如果我有5个视频,每个视频的大小都是100MB(总数将是500MB),那就没问题了。
我想知道这是一个限制规则还是一些故障,两者有相同的错误。我没有找到任何关于它的文件。我在IE和Chrome中测试过它。
修改 好的,我在存储文件时显然在indexedDB的add或put函数中得到了这个错误:
在e.target.error.message中:
序列化值太大(大小= 140989466字节,最大值= 133169152字节)
答案 0 :(得分:0)
我认为这与您的浏览器的IndexedDB实现有关。当我尝试将100 MB的文件存储到IndexedDB记录中时,我自己在Firefox中遇到了相同的错误,但是相同的代码在Chrome中工作正常。似乎不同的浏览器具有不同的实现怪癖和限制。
我个人认为这是Firefox中的错误,因为Firefox会授予所请求的大小,但是会阻止使用单个记录来使用整个大小,而Chrome更为宽容。
答案 1 :(得分:0)
在提出此问题时,Chrome仍不支持将only came the next month的Blob保存到IndexedDB。
对于如今面临相同问题的任何人,请直接存储Blob或文件,而不是ArrayBuffers。
与ArrayBuffers相反,将Blob保存到IDB不需要序列化其数据,the serialization steps of a Blob仅是制作js对象的快照并将链接保留到相同的基础字节序列,该序列本身就是未克隆。
您应该面对的唯一限制是the one of the db itself。
摘自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.');
};