我想将图像从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时,它将以'undefined'的形式返回到openImage。
答案 0 :(得分:1)
getBase64Image是异步的,因此当以同步方式调用它时,它将返回未定义的状态。
您可以尝试类似的事情
openImage = async (index) => {
const url = formatURLs[index];
const base64 = await this.getBase64Image(url);
this.setState(prevState => ({
currentImage: index,
currentImagebase64: base64
}));
}
async getBase64Image(url) => {
const response = await fetch(url);
const blob = await response.blob();
const reader = new FileReader();
await new Promise((resolve, reject) => {
reader.onload = resolve;
reader.onerror = reject;
reader.readAsDataURL(blob);
});
return reader.result.replace(/^data:.+;base64,/, '')
}
答案 1 :(得分:0)
您必须在.then()内部设置状态
getBase64Image(url) {
fetch(url).then(r => r.blob()).then(blob => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, '');
this.setState({
currentImagebase64: b64
});
};
reader.readAsDataURL(blob);
});
}