我想伪造一个响应。我有一个png
图像的base64字符串数据。现在我想做出回应,但它不起作用。
我的代码:
const data = "data:image/png;base64,iVBORw0KGgoAAAA...";
const res = new Response(data, {
status: 200,
statusText: "OK",
headers: {
"Content-Type": "image/png",
"Content-Length": data.length
},
});
我做了一些研究,似乎base64
不能直接传递给响应体。它需要转换为缓冲区或类似的东西。
它可以在NodeJS中完成,比如Buffer.from(data, 'base64')
但我的代码只在浏览器中。
我有什么办法可以实现这一点吗。
base64是一个编码字符串,要获得实际图像,需要使用atob
将其转换为二进制数据。这里有一个例子:
const b64String = data.split(',')[1];
var byteString = atob(b64String);
var arrayBuffer = new ArrayBuffer(byteString.length);
var intArray = new Uint8Array(arrayBuffer);
for (var i = 0; i < byteString.length; i++) {
intArray[i] = byteString.charCodeAt(i);
}
var imageBlob = new Blob([intArray], {type: 'image/png'});
const res = new Response(imageBlob, {
status: 200,
statusText: "OK",
headers: {
"Content-Type": "image/png",
"Content-Length": imageBlob.size
},
});
https://dev.to/ionic/converting-a-base64-string-to-a-blob-in-javascript-35kl
const base64Response = await fetch(`data:image/jpeg;base64,${base64Data}`);
就这么简单。
您可以通过重新创建Response对象并使用.blob()
的结果作为正文来设置其他标头:
new Response(await base64Response.blob(), {
status: 200,
statusText: "OK",
headers: {
"Content-Type": "image/png",
...
}
})