Keliru semasa menghantar data imej binari (jpg) ke bahagian belakang AWS Lambda melalui Gerbang API AWS
P粉300541798
P粉300541798 2024-04-05 13:09:55
0
1
569

Maaf terlebih dahulu jika saya terlepas sesuatu yang mudah! Saya telah berjaya menghantar imej daripada React ke AWS Lambda melalui AWS API Gateway. Saya memuat naiknya ke baldi s3 dalam fungsi Lambda yang sama. Berikut ialah kod 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)
}

Pada API Gateway, saya mendayakan pemajuan proksi Lambda dan mendayakan format imej binari seperti yang ditunjukkan di bawah

Tetapan proksi Lambda

Tetapan Perduaan Gateway API

Sekarang inilah bahagian yang pelik...sekurang-kurangnya bagi saya.. Dalam kod backend Python saya ada:

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)

Tetapi anda nampak saya perlu melakukan ini:

decoded_data = base64.b64decode(data)

Saya fikir saya gila, jadi saya pergi ke Posmen, menyalin arahan curl dan mengubah suainya untuk menghantar data binari daripada command prompt saya seperti ini:

curl --location --request PUT "apigatewayurl" \
--header "Content-Type: image/jpeg" \
--data-binary "@/Users/user/Documents/IMG_7138.jpg"

Ia berfungsi dengan baik.

Saya sepatutnya base64 mengekod data tetapi daripada apa yang saya lihat API Gateway atau sesuatu dalam rantaian sudah melakukannya. Tolong beritahu saya jika saya melakukan sesuatu yang salah dan jika ia perlu dilakukan dengan cara yang lebih baik.

P粉300541798
P粉300541798

membalas semua(1)
P粉799885311

Baiklah, sila lihat artikel inihttps://aws.amazon.com/blogs/compute/handling-binary-data-using-amazon-api-gateway-http-apis/, nampaknya pengekodannya adalah mengikut pengepala "jenis kandungan" untuk ditentukan. Anda boleh melihat kod belakang Python dengan menggunakan kod berikut dalam fungsi Lambda dan melihat keputusan dalam log CloudWatch:

print("isBase64Encoded: %s" % event['isBase64Encoded'])

Saya akan menyimpan kod dan penyelesaian di sini supaya orang lain boleh menggunakannya jika mereka memerlukan bantuan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan