我正在使用一个名为react-avatar-editor的库来创建用户的个人资料图片。以下是我用于向服务器发送裁剪后的图像的代码。
const canvasScaled = this.editor.getImageScaledToCanvas(); //a canvas object
canvasScaled.toBlob((blob) => {
this.setState({
preview: blob
},
() => {
let data = new FormData();
const file = new File([blob], "my-image", {
type: "image/png"
});
data.append("file", file);
axios({
method: "POST",
data: data,
url: "/media",
headers: {
'Content-Type': 'multipart/form-data'
}
}).then().catch()
}
);
})
但服务器生成的图像是一张黑色图片。测试了很多文件,但结果都是一样的——一张黑色图片。
我的后端服务是用JAVA编写的,所以我测试了一下后端服务是否正确处理了图像,我写了一个简单的文件选择器。
<input type="file" accept={"image/png"} onChange={onSelect}/>
<button onClick={() => {
const data = new FormData();
data.append("file", this.state.file);
axios({
method: "POST",
data: data,
url: "/media",
headers: {
'Content-Type': 'multipart/form-data'
}
}).then().catch()
}}>Send<button>
是的,服务端代码与上述 POST
请求一起正常工作。这意味着,我在处理 react-avatar-editor 代码时肯定有些错误。
是 blob
导致问题吗?在文件选择器的情况下,图像是如何发送的?使用Base64还是Blob?
更新:我注意到一个奇怪的现象。如果我上传这个文件 它会被转换为 这不是完全黑色的图像。颜色出了些问题。
为了检查库本身是否正在创建黑色图像,我使用 canvasScaled.toDataURL("image/png")
进行检查,并将其用于图像,可以看到创建的画布没有问题,图像可以被渲染。
ctx.fillRect(0, 0, canvas.width, canvas.height);
不应该是ctx.fillRect(0, 0, canvasScaled.width, canvasScaled.height);
吗? - The Coder