微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 XMLHTTPResponseText 解码为 dataUrl,无需在服务器端进行基本编码

如何解决将 XMLHTTPResponseText 解码为 dataUrl,无需在服务器端进行基本编码

如何在客户端将 XMLHTTPRequest 的纯文本响应转换为 dataUrl?

图像数据正在从服务器发送到 Iframe,检索数据的唯一选项是来自 GET 请求的认编码数据。* 我对服务器没有任何控制权。我无法指定 overrideMimeType 或请求的 responseType。

我尝试对返回的数据进行 utf8 编码:

const utf8 = new TextEncoder();
const bytes  = utf8.encode(imageDataAsText);

//Convert to data url
const fr = new FileReader();
const blob = new Blob([bytes],{ type: attachment.Metadata.mediaType });
fr.onload = (e) => {
   setimageData(fr.result as string);
};
fr.readAsDataURL(blob);

通过字符代码转换也不起作用: https://stackoverflow.com/a/6226756/3244464

let bytesv2 = []; // char codes

for (var i = 0; i < imageDataAsstring.length; ++i) {
   var code = imageDataAsstring.charCodeAt(i);
   bytesv2 = bytesv2.concat([code & 0xff,code / 256 >>> 0]);
}

控制台输出显示的原始数据。我在这里使用的数据的实际认编码是什么?

Recieved data

上下文:

* 有问题的数据是在 atlassian (jira/confuence) 生态系统内的 iframe 内接收的。它们不支持从父框架到 iframe 的管道二进制数据,由于授权流程需要存储在父页面上的 cookie,我也不能提出自己的请求。提到覆盖某些编码或在服务器端更改它的所有其他选项不适用于这种特定情况。

解决方法

当您使用 XMLHttpRequest 获取二进制数据时,不要将其作为字符串返回。使用 xhr.responseType = 'blob'(如果您打算读取/修改它,则使用 arrayBuffer)

var xhr = new XMLHttpRequest()
xhr.responseType = 'blob'
xhr.onload = () => {
  // Convert xhr blob to data url
  const fr = new FileReader()
  fr.onload = () => {
    setImageData(fr.result)
  }
  fr.readAsDataURL(xhr.response)
}

最好使用 fetch api 而不是旧的 XMLHttpRequest 来获取二进制文件 它在网络工作者和服务器中更受欢迎。它也更简单,基于承诺

fetch(url)
  .then(res => res.blob())
  .then(blob => { ... })

为什么你需要它是一个 base64 网址?如果只是为了显示 <img> 的预览,那么它就是在浪费时间、CPU 和内存。 最好这样做:

img.src = URL.createObjectURL(blob)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。