首頁  >  問答  >  主體

在透過AWS API Gateway將二進位映像(jpg)資料傳送到AWS Lambda後端時遇到困惑

如果我錯過了一些簡單的東西,提前道歉!我已經成功地透過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粉300541798P粉300541798218 天前494

全部回覆(1)我來回復

  • P粉799885311

    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'])

    我會在這裡保留程式碼和解決方案,以便其他人需要幫助時可以使用。

    回覆
    0
  • 取消回覆