如果我錯過了一些簡單的東西,提前道歉!我已經成功地透過AWS API Gateway從React將映像傳送到AWS Lambda。我將其上傳到同一個Lambda函數中的s3儲存桶中。以下是React程式碼:
// 在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) }
在API Gateway上,我啟用了Lambda代理程式轉發,並啟用了二進位映像格式,如下所示
Lambda代理設定
API Gateway二進位設定
現在這裡是奇怪的部分...至少對我來說.. 在我的Python後端程式碼中,我有:
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)
但你看我必須這樣做:
decoded_data = base64.b64decode(data)
我以為我瘋了,所以我進入了Postman,複製了curl命令,並修改它以從我的命令提示字元發送二進位數據,如下所示:
curl --location --request PUT "apigatewayurl" \ --header "Content-Type: image/jpeg" \ --data-binary "@/Users/user/Documents/IMG_7138.jpg"
它運行得很好。
我應該對資料進行base64編碼,但從我看到的API Gateway或鏈中的某些東西已經這樣做了。請告訴我是否做錯了,並且是否應該以更好的方式進行。
P粉7998853112024-04-06 09:34:30
好的,請看這篇文章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'])
我會在這裡保留程式碼和解決方案,以便其他人需要幫助時可以使用。