Heim  >  Fragen und Antworten  >  Hauptteil

Beim Senden binärer Bilddaten (jpg) an das AWS Lambda-Backend über AWS API Gateway ist es verwirrend

Entschuldigung im Voraus, wenn ich etwas Einfaches verpasst habe! Ich habe erfolgreich Bilder von React über AWS API Gateway an AWS Lambda gesendet. Ich habe es in derselben Lambda-Funktion in einen S3-Bucket hochgeladen. Hier ist der React-Code:

// 在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)
}

Auf API Gateway habe ich die Lambda-Proxy-Weiterleitung und das binäre Bildformat aktiviert, wie unten gezeigt

Lambda-Proxy-Einstellungen

API-Gateway-Binäreinstellungen

Jetzt kommt der seltsame Teil...zumindest für mich.. In meinem Python-Backend-Code habe ich:

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)

Aber du siehst, ich muss das tun:

decoded_data = base64.b64decode(data)

Ich dachte, ich wäre verrückt, also ging ich zu Postman, kopierte den Befehl „curl“ und änderte ihn so, dass er Binärdaten von meiner Eingabeaufforderung aus sendete, etwa so:

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

Es funktioniert großartig.

Ich sollte die Daten mit Base64 kodieren, aber soweit ich sehe, macht API Gateway oder etwas in der Kette das bereits. Bitte sagen Sie mir, wenn ich etwas falsch mache und ob es besser gemacht werden sollte.

P粉300541798P粉300541798167 Tage vor384

Antworte allen(1)Ich werde antworten

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

    我会在这里保留代码和解决方案,以便其他人需要帮助时可以使用。

    Antwort
    0
  • StornierenAntwort