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.
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.