Entschuldigung im Voraus, wenn ich etwas Einfaches verpasst habe! Ich habe erfolgreich Bilder von React über AWS API Gateway an AWS Lambda gesendet. Ich habe es in derselben Lambda-Funktion in einen S3-Bucket hochgeladen. Hier ist der React-Code:
// 在APP中初始化状态 const [selectedImage, setSelectedImage] = useState(); // 输入 <input accept="image/jpg, image/jpeg, image/png" type="file" onChange={imageChange} /> ... ... // 当文件字段更改时触发此函数 const imageChange = (e) => { if (e.target.files && e.target.files.length > 0) { setSelectedImage(e.target.files[0]); } }; ... ... // 当用户点击接受按钮时触发此函数 async function submitToBackend() { // 这里的图像是jpg格式 setSelectedImage(e.target.files[0]); const backendResponse = await fetch(awsapigatewayurl, { method: "PUT", headers: { "Content-Type": "image/*", }, body: selectedImage, }) console.log(backendResponse) }
Auf API Gateway habe ich die Lambda-Proxy-Weiterleitung und das binäre Bildformat aktiviert, wie unten gezeigt
Lambda-Proxy-Einstellungen
API-Gateway-Binäreinstellungen
Jetzt kommt der seltsame Teil...zumindest für mich.. In meinem Python-Backend-Code habe ich:
def lambda_handler(event, context): key = 'test.jpg' data = event['body'] decoded_data = base64.b64decode(data) image_filelike = io.BytesIO(decoded_data) # 创建日期文件夹,如果已经创建则忽略 current_date = str(datetime.date.today()) s3_client.put_object(Bucket=BUCKET, Key=(current_date + '/')) # 将图像上传到S3 s3_client.upload_fileobj(Bucket=BUCKET, Key='%s/%s' % (current_date, key), Fileobj=image_filelike)
Aber du siehst, ich muss das tun:
decoded_data = base64.b64decode(data)
Ich dachte, ich wäre verrückt, also ging ich zu Postman, kopierte den Befehl „curl“ und änderte ihn so, dass er Binärdaten von meiner Eingabeaufforderung aus sendete, etwa so:
curl --location --request PUT "apigatewayurl" \ --header "Content-Type: image/jpeg" \ --data-binary "@/Users/user/Documents/IMG_7138.jpg"
Es funktioniert großartig.
Ich sollte die Daten mit Base64 kodieren, aber soweit ich sehe, macht API Gateway oder etwas in der Kette das bereits. Bitte sagen Sie mir, wenn ich etwas falsch mache und ob es besser gemacht werden sollte.
好的,看一下这篇文章 https://aws.amazon.com/blogs/compute/handling-binary-data-using-amazon-api-gateway-http-apis/,看起来编码是根据"content-type"头来确定的。您可以通过在Lambda函数中使用以下代码并查看CloudWatch日志中的结果来查看Python后端代码:
print("isBase64Encoded: %s" % event['isBase64Encoded'])
我会在这里保留代码和解决方案,以便其他人需要帮助时可以使用。