我正在使用this和that answer中的代码将base64编码的图像发送到python FastAPI后端。客户端看起来像这样:
function toDataURL(src, callback, outputFormat) {
var img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.naturalHeight;
canvas.width = this.naturalWidth;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
callback(dataURL);
};
img.src = src;
if (img.complete || img.complete === undefined) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}
}
function makeBlob(dataURL) {
var BASE64_MARKER = ';base64,';
if (dataURL.indexOf(BASE64_MARKER) == -1) {
var parts = dataURL.split(',');
var contentType = parts[0].split(':')[1];
var raw = decodeURIComponent(parts[1]);
return new Blob([raw], { type: contentType });
}
var parts = dataURL.split(BASE64_MARKER);
var contentType = parts[0].split(':')[1];
var raw = window.atob(parts[1]);
var rawLength = raw.length;
var uInt8Array = new Uint8Array(rawLength);
for (var i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], { type: contentType });
}
...
toDataURL(
images[0], // images is an array of paths to images
function(dataUrl) {
console.log('RESULT:', dataUrl);
$.ajax({
url: "http://0.0.0.0:8000/check/",
type: 'POST',
processData: false,
contentType: 'application/octet-stream',
data: makeBlob(dataUrl)
}).done(function(data) {console.log("success");}).fail(function() {console.log("error");});
}
);
服务器端如下:
@app.post("/check")
async def check(file: bytes = File(...)) -> Any:
// do something here
我只显示端点的签名,因为现在无论如何都没有发生任何事情。
如下所示,这是后端的输出:
172.17.0.1:36464-“ OPTIONS / check / HTTP / 1.1” 200
172.17.0.1:36464-“ POST / check / HTTP / 1.1” 307
172.17.0.1:36464-“选项/检查HTTP / 1.1” 200
172.17.0.1:36464-“ POST / check HTTP / 1.1” 422
简而言之,我一直收到422错误代码,这意味着我发送的内容与端点期望的内容不匹配,但是即使经过一番阅读,我仍然不清楚问题到底出在哪里。任何帮助将是最欢迎的!