【发布时间】:2019-08-04 13:17:02
【问题描述】:
我想将图像从 URL 转换为 base 64,并将其存储在一个状态以供以后使用。
如何从 fetch() 返回数据?
我可以使用 CORS 安全图像和 HTML 画布使其工作,但这不适用于公共域。
openImage = (index) => {
const url = formatURLs[index];
const base64 = this.getBase64Image(url);
this.setState(prevState => ({
currentImage: index,
currentImagebase64: base64
}));
}
getBase64Image(url) {
fetch(url).then(r => r.blob()).then(blob => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, '');
return b64;
};
reader.readAsDataURL(blob);
});
}
当我 console.log(reader.result) 时,它会按预期输出 base64。
但是,当我返回 b64 时,它会以“未定义”的形式返回到 openImage。
【问题讨论】:
-
为什么不只存储 Blob?
-
fetch()是 asynchronous 所以你不能从像你这样的函数返回值。您可以在.then()回调中返回 Promise 并更新状态。 -
您需要make a promise for the
b64data in the load event handler。然后你可以return那些getBase64Image返回一个承诺。更改openImage以等待 promise 的结果。 -
不要制作它的 base64 版本。正如@Bergi 所说,您最好存储Blob。如果需要持久化,则使用 IndexedDb 来存储 Blob。当您需要显示图像时,请使用 blobURI (URL.createObjectURL)。如果您正在生成一个需要嵌入该文件的独立文档,您只需要一个 dataURI,而且您似乎不在这种非常罕见的情况下。
标签: javascript reactjs