Javascript 无法在Safari上的IndexedDB中存储Blob类型

Javascript 无法在Safari上的IndexedDB中存储Blob类型,javascript,ios,safari,blob,indexeddb,Javascript,Ios,Safari,Blob,Indexeddb,我在Safari版本10.1.2的IndexedDB中存储blob时遇到问题(在IOS上也面临同样的问题) 但是,我使用的是angular2 indexeddb模块包装器——我认为模块本身没有问题。我的代码在Chrome中运行良好,但是当尝试在Safari indexedDb中放置blob对象时,记录始终显示为“null”(请参见FileData字段): 我尝试过各种不同的blob文件(音频、视频、html),它们总是显示为“null”。插入此记录时,IndexedDb不会返回任何(可见)错误

我在Safari版本10.1.2的IndexedDB中存储blob时遇到问题(在IOS上也面临同样的问题)

但是,我使用的是angular2 indexeddb模块包装器——我认为模块本身没有问题。我的代码在Chrome中运行良好,但是当尝试在Safari indexedDb中放置blob对象时,记录始终显示为“null”(请参见FileData字段):

我尝试过各种不同的blob文件(音频、视频、html),它们总是显示为“null”。插入此记录时,IndexedDb不会返回任何(可见)错误

据我所知,在Safari中应该支持blob。我认为这个问题可能与blob的产生方式有关?i、 e.也许Safari不喜欢blob数据

下面是我的代码示例(我在这里没有包含太多内容,因此如果需要更多信息,请告诉我):

//创建blob:
常量aFileParts=['foo!'];
constmyblob=newblob(aFileParts,{type:'text/html'});
console.log('blob类型'+myblob.type);//输出为“文本/html”
//初始化我的indexeddb存储:
返回此.initializeStores()。然后(()=>{
//将“myBlob”添加到FileData数据存储:
返回此.db.add('FileData',
{FileName:'foo',FileData:myblob,FileType:'audio'})。然后(()=>{
//成功
log('将'+'foo'+'添加到文件数据存储');
//从FileData存储中获取文件
返回这个.db.getByIndex('FileData','FileName','foo')。然后((record)=>{
返回承诺。解决();
});
},(错误)=>{
console.log(错误);
此.handleError(错误)
返回承诺。拒绝(错误);
});
},(错误)=>{
此.handleError(错误);
返回承诺。拒绝(错误);
});
顺便说一下,我可以将此数据作为ArrayBuffer存储在Safari IndexedDB中,不会出现任何问题。问题是,当我从db中检索它时,我必须将它转换回blob(所需的额外处理能力并不理想)


非常感谢您的帮助。

因此我设法找到了问题的原因。创建我的商店时,我引用了一个不正确的索引(主要是因为我在遵循在线教程)

我的存储中不存在密钥路径“id”。这是在保存blob时导致问题的原因(奇怪的是,没有报告错误……而且它似乎没有在chrome上引起问题)

正确的代码:

const objectDataStore = evt.currentTarget.result.createObjectStore(
    'FileData', { keyPath: 'FileName', autoIncrement: true });
“FileName”是我的存储对象中的属性名称。这现在解决了桌面safari上的问题。因此,这里的教训是确保关键路径是正确的

然而,我现在面临一个新问题。在IOS Safari上,blob无法持久化到indexedDb。我得到以下错误:

error: DOMError {name: "UnknownError", message: "An unknown error occurred within Indexed Database."}

因此,IOS Safari上的indexedDb似乎不支持Blob(我假设这是一个bug)。现在我只存储ArrayBuffers而不是Blob。

是的,我可以确认在iOS Safari 11.2.6版上,IndexedDB不能将Blob存储为值

我写了一小段代码来存储一个字符串值,它可以正常工作。如果我用完全相同的代码注释掉字符串并用Blob替换它,Safari会给出一个“未知错误”

{name:“UnknownError”,消息:“索引数据库中发生未知错误。”}


可能在存储之前尝试将Blob转换为ArrayBuffer。

如果iOS/OSX上的indexedDb仍然存在问题,请不要使用自动递增,因为这是Safari中的一个错误。

上次我检查Safari时,Safari不支持Blob。我可以创建blob,将它们显示为视频,但不能将它们保存在IndexedDB中。有点奇怪,对不起。我的意思是说indexeddb的safaris实现不支持编写或读取blobsSorry不记得确切的源代码。我知道这是真的,当blob存储第一次出现时,但不确定是否仍然是真的,我在LocalFough中遇到了类似的问题。我可以通过将blob保存在主_对象的根位置来解决这个问题,而不是将其作为更深一层对象的
file
属性干净地存储。为了使其正常工作,我创建了一个唯一的id,并将其存储在deep对象中,这允许我在根位置检索Blob。但是这是LocalFough的问题,我再也没有遇到过这个bug(不确定它是否被Safari更新或其他东西修复了),谢谢,但我已经在上面的回答中说明了这个解决方案。你知道这个bug是否仍然存在于iOS中吗?@Neryortz我不确定,我已经有一段时间没有使用这个功能了。
const objectDataStore = evt.currentTarget.result.createObjectStore(
    'FileData', { keyPath: 'FileName', autoIncrement: true });
error: DOMError {name: "UnknownError", message: "An unknown error occurred within Indexed Database."}