相关疑难解决方法(0)

HTML5 视频源作为本地存储的 blob 不再工作

从 Chrome 80 开始,Blob 或 IndexedDB 的工作方式似乎发生了一些变化。

将视频文件作为 blob 加载并通过 createObjectURL 将其分配给 HTML5 Video 元素,仍然有效:

// load the blob through XMLHttprequest
RequestAsBlob("https://devserver/some-video.mp4",
function(blob)
{
  video.src = URL.createObjectURL(blob); 

  // same above, video.src is now "blob:https://devserver/36e15718-e597-4859-95d3-6bc39daaa999"
}

video.play();
Run Code Online (Sandbox Code Playgroud)

输出:Promise {} 并且视频播放得很好。

检查 blob,它看起来像这样:

Blob {size: 6752122, type: "video/mp4"}
size: 6752122
type: "video/mp4"
__proto__: Blob
arrayBuffer: ƒ arrayBuffer()
size: (...)
slice: ƒ slice()
stream: ƒ stream()
text: ƒ text()
type: (...)
constructor: ƒ Blob()
Symbol(Symbol.toStringTag): "Blob"
get size: ƒ size()
get type: …
Run Code Online (Sandbox Code Playgroud)

javascript blob indexeddb

10
推荐指数
1
解决办法
4010
查看次数

如果从索引访问,IndexedDB 无法正确获取 Blob(WebKitBlobResource 1. 错误)

我有完整的代码,你可以在最后复制,这样你就可以检查这个问题。

特尔;博士: 我使用的是 Safari 13.1,并且在将 Blob 存储在 IndexedDB 中之后。如果我关闭浏览器,我只能直接通过对象存储访问这些 Blob,而不能通过该对象存储的某些索引访问。如何使用索引正确恢复 Blob?

可能是我做错了什么,但这似乎在谷歌浏览器中没有任何问题。我在 IndexedDB 对象存储中存储了一个 Blob。我的意图是稍后获取它,并使用 URL.createObjectURL(blob) 使 blob 的内容可下载。

如果我存储 Blob 并且没有关闭选项卡,我会尝试恢复它并创建一个 URL,它可以正常工作,并且 URL 可以工作。我取回 Blob 的方式无关紧要(直接或通过索引)。在示例中,我只有一个 Blob。如果我这样做objectStore.index('index1').getAll('foo')objectStore.getAll()它有效。

但是如果我重新启动 Safari 并再次打开网页,现在我只能直接从 objectStore ( objectStore.getAll()) 中获取 Blob 。但是,如果我尝试从索引 (objectStore.index('idx').getAll(key) ) 中则 Blob 不起作用。我正确获取了所有对象,其余信息存储在对象存储中,但 Blob 不起作用,如果我创建一个 URL,我会得到一个 WebKitBlobResource 1. 错误。

这是一些示例代码。

如果数据库不存在,它会使用对象存储和索引创建它,并在其中存储一个 Blob。有两个按钮可以从该 blob 生成 URL,它们都可以正常工作。如果重新启动 Safari,则只有其中一个有效(直接获取 Blob 的那个),另一个使用索引从数据库中获取的 URL 返回不起作用的 URL。

<!DOCTYPE html>
<html>
<head>
  <title>Bug retrieving blobs from database</title>
</head>
<body>

<button id="clear-btn">Clear</button>
<button …
Run Code Online (Sandbox Code Playgroud)

javascript safari blob indexeddb

5
推荐指数
0
解决办法
190
查看次数

标签 统计

blob ×2

indexeddb ×2

javascript ×2

safari ×1