Можно ли передать File Object в AWS Lambda через API Gataway в javascript? - PullRequest
2 голосов
/ 02 апреля 2020

Можно ли передать JavaScript File Object из браузера в AWS Lambda через API-шлюз (наконец, в S3). Я использую TypeScript и React.

Среда

Внешний интерфейс

  • TypeScript
  • React
  • AWS Усиление (для используйте модуль API)

Backend (AWS Lambda)

  • Node.js

Что ожидается

до передать File Object, полученное из браузера по <input type='file'>, в бэкэнд aws лямбда через API-шлюз.

Что происходит

console.log(event) в бэкэнде, вывод журнала был пустым.

Что я хочу знать

как правильно передать File Object(Blob) в лямбду. (Просто ссылка на документ, мне это тоже очень поможет.)

Код (внешний интерфейс)

import { API } from 'aws-amplify'
...
const file = { body: this.state.file }
console.log(file) // output was collect File Object at this time
API.post(<API_NAME>, <PATH>, file)
  .then(response => {
    console.log(response)
  }).catch(error => {
    console.log(error)
  })

Код (внутренний интерфейс)

exports.lambdaHandler = function (event, context, callback) {
  console.info(`event.body: ${event.body}`) // got `event.body: {}` at Cloud Watch Logs
  ...
}

Это так? Возможно, что я пытаюсь сделать, установив Content-Type или что-то? (Я не смог найти никакой документации. Я начал программировать только один год).

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Я не согласен с ответом sidali по многим причинам (безопасность, стоимость, ...). Вам не нужно общедоступное хранилище S3.

Рекомендуется запросить предварительно назначенный URL-адрес для S3 через ваш API Gateway + Lambda. С этим URL только указанный c пользователь сможет загружать файл в течение определенного периода времени (например, 1 минута или 5 часов).

const getSignedUrlForUpload = async () => {
  const params = {
    Bucket: BUCKET_NAME,
    Key: 'AWS_Cloud_Best_Practices.pdf',
    Expires: 60,
    ContentType: 'application/pdf',
  }


  const url = await new Promise((resolve, reject) => {
    s3.getSignedUrl('putObject', params, (err, url) => {
      if (err) reject(err)

      resolve(url)
    })
  })

  return url
}

uploadFileToS3()
  .then((res) => {
    console.log(res)
  }).catch((e) => {
    console.log(e)
  })

Источник: https://arpadt.com/articles/presigned-urls-in-node#34 -upload-link

0 голосов
/ 02 апреля 2020

Вы должны загрузить свой файл в s3 непосредственно в указанный c Bucket и создать лямбда-событие триггера при загрузке s3 в этом конкретном Bucket,

Таким образом, лямбда будет запускаться при каждой отправке файла , вы можете там прочитать ваш файл и сделать ваш процесс.

Пожалуйста, прочитайте https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...