【问题标题】:Loading image with XHR without responseType set to blob使用 XHR 加载图像,但没有将 responseType 设置为 blob
【发布时间】:2022-01-09 04:16:08
【问题描述】:

我有这种情况,我使用 XMLHttpRequest 加载图像但没有将 responseType 设置为 blob。所以我收到一个字符串

我的问题是,在这种情况下是否仍然可以渲染图像?

例如,我尝试将此字符串转换为 Blob

out = new Blob([imageString],  { type: 'image/png' });

但这不会呈现预期的图像。有什么建议吗?

DEMO

这就是我的节点后端如何将该图像发送到浏览器

app.get("/binary/*", (req: express.Request, res: express.Response) => {
  const file = binaryPath + '/test.jpg';
  res.sendFile(file);
});

【问题讨论】:

  • 是不是图片格式不一样,比如out = new Blob([imageString], { type: 'image\/jpeg' });
  • 似乎没有任何区别
  • 在我的应用程序中,我通过 websocket 获取二进制图像,然后通过blob = new Blob([data], {'type': 'image\/jpeg'}); url = window.URL.createObjectURL(blob); 渲染它并设置<img src=url>。这样可行。你确定你的imageString 是一个二进制字符串吗?您可以检查 btoa(imageString) 是否给出正确的 base64 编码图像 ...
  • 这是一个堆栈闪电战:stackblitz.com/edit/… 如您所见,它似乎不起作用
  • 我用不同的编码做了一些实验,但没有成功。所以我最好的猜测是问题是由于控制台中的这个警告:WARNING: sanitizing unsafe URL value blob。以下是您可能需要考虑的一些输入:roufid.com/warning-sanitizing-unsafe-url-value-angular

标签: javascript image xmlhttprequest


【解决方案1】:

终于明白了:如果你不想拥有xhr.responseType = 'blob'并且你想从接收到的数据中创建一个url,那么你需要设置xhr.responseType = 'arraybuffer'。这允许将二进制 xhr.response 转换为 blob,然后创建 URL.createObjectURL

关键是,当您不将responseType 设置为二进制类型时,您将获得默认的xhr.responseType = 'text' 和utf8 编码。然后 blob 创建失败。

我已将此解决方案包含在您的 stackblitz 中。

【讨论】:

  • 我认为你是对的。但不知何故,我希望应该可以将二进制字符串转换为 Blob 或 ObjectURL。不过不管怎样,只要这个没有被证实,我都会接受你的回答!
  • 我尝试了许多不同的方法来将 utf8 字符串解码为二进制 arrayBuffer 格式,该格式允许转换为 blob - 到目前为止没有成功。
猜你喜欢
  • 2013-05-26
  • 2020-07-19
  • 1970-01-01
  • 2021-09-17
  • 2019-01-18
  • 1970-01-01
  • 2012-12-02
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多