Confus lors de l'envoi de données d'image binaire (jpg) au backend AWS Lambda via AWS API Gateway
P粉300541798
P粉300541798 2024-04-05 13:09:55
0
1
568

Désolé d'avance si j'ai raté quelque chose de simple ! J'ai envoyé avec succès des images de React à AWS Lambda via AWS API Gateway. Je l'ai téléchargé dans un compartiment s3 dans la même fonction Lambda. Voici le code 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)
}

Sur API Gateway, j'ai activé le transfert de proxy Lambda et le format d'image binaire comme indiqué ci-dessous

Paramètres du proxy Lambda

Paramètres binaires de la passerelle API

Maintenant, voici la partie bizarre... du moins pour moi... Dans mon code backend Python, j'ai :

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)

Mais tu vois, je dois faire ceci :

decoded_data = base64.b64decode(data)

Je pensais que j'étais fou, alors je suis allé dans Postman, j'ai copié la commande curl et je l'ai modifiée pour envoyer des données binaires depuis mon invite de commande comme ceci :

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

Ça fonctionne très bien.

Je devrais encoder les données en base64, mais d'après ce que je vois, API Gateway ou quelque chose dans la chaîne le fait déjà. S'il vous plaît, dites-moi si je fais quelque chose de mal et si cela devrait être fait d'une meilleure manière.

P粉300541798
P粉300541798

répondre à tous(1)
P粉799885311

D'accord, jetez un œil à cet articlehttps://aws.amazon.com/blogs/compute/handling-binary-data-using-amazon-api-gateway-http-apis/, il semble que l'encodage soit selon l'en-tête "content-type" à déterminer. Vous pouvez afficher le code backend Python en utilisant le code suivant dans une fonction Lambda et en affichant les résultats dans les journaux CloudWatch :

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

Je conserverai le code et la solution ici afin que d'autres puissent les utiliser s'ils ont besoin d'aide.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal