【问题标题】:createReadStream doesn't take blob url?createReadStream 不采用 blob url?
【发布时间】:2020-03-25 22:34:20
【问题描述】:

this.state.videoBlob 是一个 blob 对象。我使用 URL.createObjectURL 生成了一个 blob URL,并将其传递给 fs.createReadStream,如下所示: fs.createReadStream(URL.createObjectURL(this.state.videoBlob)) 此 blob 网址如下所示: blobURL: blob:http://localhost:3000/dabe5cdd-00cc-408a-9f3d-b0ba5f2b10b3

但我收到一条错误消息: TypeError: fs.createReadStream is not a function

如果我传递了一些在线视频 URL,问题就不会存在。那么如何从fs.createReadStream 读取blob?谢谢!

【问题讨论】:

  • 当我查看fs.readStream() 后面的代码时,它会调用new ReadStream() 并将路径/url 传递给它。在this line of code 上,似乎唯一受支持的 url 类型是文件 URL。该文档对该主题保持沉默,这就是我去看代码的原因。
  • 我不明白这样的 URL 的意义:blob:http://localhost:3000/dabe5cdd-00cc-408a-9f3d-b0ba5f2b10b3 所以我不知道如何处理它。如果它是远程资源,那么您可以在实际 URL 上使用 http.get()request(),然后您将获得一个 readStream。
  • blob:http://localhost:3000/dabe5cdd-00cc-408a-9f3d-b0ba5f2b10b3 是我在浏览器中制作的网络摄像头视频的 blob 地址

标签: node.js blob


【解决方案1】:

当我查看fs.createReadStream() 背后的代码时,它会调用 new ReadStream() 并将路径/url 传递给它。在this line of code 上,似乎唯一受支持的 url 类型是文件 URL。该文档对该主题保持沉默,这就是我去看代码的原因。所以,在我看来,fs.createReadStream() 不支持这种类型的伪 URL。

由于您只需要来自该 URL 的读取流并且您拥有远程资源的实际 URL,我建议您只使用 http.get()request() 或类似的东西,因为它们都会联系远程主机并返回给你一个readStream。由于您的目标是获取 readStream,因此这是实现该目标的一种方法。

http.get('http://localhost:3000/dabe5cdd-00cc-408a-9f3d-b0ba5f2b10b3', (res) => {
     // res is a readstream here
}).on('error', (err) => {
     // error on the request here
});

仅供参考,您可能会发现this answer on Blob URLs 很有用。我没有看到任何证据表明fs.createReadStream() 支持 blob URL。在浏览器中,它们仅由浏览器内部创建,仅在特定网页上下文中有用(它们间接引用某些内部存储),不能在网页外部传递,甚至不能从一个网页保存页到下一页。如果您希望您的服务器能够从浏览器中创建的 blob URL 访问实际数据,则必须将实际数据上传到您的服务器。您的服务器无法访问在浏览器中创建的 blob URL。

【讨论】:

  • @damingzi - 这对你有解释吗?
  • 谢谢@jfriend00。它解释了为什么 fs.createReadStream() 不适用于浏览器生成的 blob。
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 2018-11-30
  • 1970-01-01
  • 2020-11-16
  • 2020-03-01
  • 1970-01-01
  • 2019-02-03
  • 2015-08-30
相关资源
最近更新 更多