1

重複した質問の説明: この質問は、S3 に直接ではなくラムダ関数を介して画像を送信しようとしているため、この質問の重複ではありません。ラムダを使用してユーザーと権限を確認し、DB 呼び出しを行ってデータを保存する場所を見つけ、データの場所の DB を更新する必要があります。

Lambda を使用してバイナリ イメージを S3 に配置しようとしています。画像は API ゲートウェイ エンドポイントにポストされ、ラムダ関数にプロキシされます。関数はデータを S3 オブジェクトに正常に配置しますが、(コンソール経由で) オブジェクトをダウンロードして読み取ると、常に破損し、入力オブジェクトよりも小さい場合があり、開くことができません。

破損はmultipart/form-data、ファイルに何かが追加されたり、ファイルがエンコードされたりする可能性があることに関係していると思いますが、画像データを直接抽出する方法を正確に理解することはできません。

multipart/form-dataイメージを S3に適切に配置するにはどうすればよいですか?

ラムダに投稿するネイティブコードに反応する

const body = new FormData();
body.append('photo', {
  uri: image.image,
  name: image.name,
  type: image.type,
});

fetch('https://ov2eat1o5h.execute-api.us-east-1.amazonaws.com/dev/uploadImage', {
  method: 'POST',
  headers: {
    Authorization: token,
    'Content-Type': 'multipart/form-data',
  },
  body,
})
  .then(response => response.json())
  .then(responseJson => {
    console.log(responseJson);
  })
  .catch(error => {
    console.error(error);
  });

ラムダ コード:

const AWS = require('aws-sdk');

exports.handler = async event => {
  const s3 = new AWS.S3();
  const params = {
    Body: event.body,
    Bucket: 'projectr.app',
    Key: 'exampleobject.jpg',
  };
  const response = await s3.putObject(params).promise();
  console.log(response);
};

破損した画像

試した他のこと:

parse-multipart: 常に空の配列を返します

const boundary = event.headers['content-type'].slice(20);
let {body} = event;
if (event.isBase64Encoded) {
  body = Buffer.from(event.body, 'base64');
}
const parts = multipart.Parse(body, boundary);

for (let i = 0; i < parts.length; i++) {
  const part = parts[i];
  console.log(`PART ${i}: ${part}`);
}

ContentTypeS3 パラメータでの定義: 識別可能な違いはありません。

const params = {
  Body: event.body,
  Bucket: 'projectr.app',
  Key: 'exampleobject.jpg',
  ContentType: 'multipart/form-data',
};
4

0 に答える 0