Попытка обслужить файл изображения из S3 с помощью API Gateway и Lambda приводит к повреждению файла - PullRequest
1 голос
/ 06 октября 2019

Я создал метод AWS API Gateway, который вызывает функцию Lambda, которая должна возвращать файл изображения в виде вложения пользователю. Метод API Gateway настроен на использование Lambda Proxy Integration (запросы передаются в Lambda). Моя лямбда-функция очень проста:

const aws = require('aws-sdk');
const s3 = new aws.S3();

exports.handler = async event => {
  try {
    const Bucket = event.xxx;
    const Key = event.yyy;
    const file = await s3.getObject({ Bucket, Key }).promise();

    return {
      body: file.Body.toString(),
      headers: {
        'Content-Disposition': `attachment; filename=test.jpg`,
        'Content-Length': file.ContentLength,
        'Content-Type': file.ContentType,
      },
      statusCode: 200,
    };
  } catch (e) {
    console.error(e);
  }
};

Однако загруженные таким образом файлы отличаются по размеру от оригинальных и повреждены.

Например, я пытался загрузить файл 81264 байта, нозагруженная версия имеет размер 146650 байт.
Изучая заголовки ответов от Lambda, я вижу, что Content-Length на самом деле 67432 (хотя он установлен на file.ContentLength, что 81264), но есть и пользовательскийзаголовок x-amzn-Remapped-Content-Length, который показывает правильный размер (81264).

Что я должен сделать, чтобы правильно ответить верным файлом обратно?

1 Ответ

0 голосов
/ 06 октября 2019

Это выглядит немного более связанным с общей настройкой API Gateway, начиная с определения «Бинарных типов носителей» в настройках API (например, image/jpeg, application/pdf и т. Д.) И исходя из "Содержимое ответа API-шлюзаПреобразование типов " запрос также должен отправлять заголовок Accept.

Наконец, я должен был преобразовать Body в base64 вместе с добавлением isBase64Encoded: true к ответу, который затем выглядит следующим образом:

return {
  body: file.Body.toString('base64'),
  headers: {
    'Content-Disposition': `attachment; filename=test.jpg`,
    'Content-Length': file.ContentLength,
    'Content-Type': file.ContentType,
  },
  statusCode: 200,
  isBase64Encoded: true,
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...