【问题标题】:Is it possible to pass File Object to AWS Lambda through API Gataway in javascript?是否可以通过 JavaScript 中的 API Gateway 将文件对象传递给 AWS Lambda?
【发布时间】:2020-07-14 13:51:56
【问题描述】:

是否可以通过 API Gateway 将 JavaScript File Object 从浏览器传递到 AWS Lambda(最终传递到 S3)。我正在使用 TypeScript 和 React。

环境

前端

  • 打字稿
  • 反应
  • AWS Amplify(使用 API 模块)

后端(AWS Lambda)

  • Node.js

预期结果

File Object(由<input type='file'>从浏览器获取)通过API网关传递给后端aws lambda。

发生了什么

console.log(event)在后端,日志输出为空。

我想知道的

如何正确地将File Object(Blob) 传递给 lambda。 (只是一个文档链接,它对我也很有帮助。)

代码(前端)

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 或其他方式来尝试做些什么? (我找不到任何文档。我开始编程才一年)。

【问题讨论】:

  • 这是一个非常好的、清晰且(可能)可以回答的问题。我已经从中删减了一些喋喋不休,但做得很好。

标签: javascript reactjs typescript aws-lambda


【解决方案1】:

出于多种原因(安全性、成本……),我不同意 sidali 的回答。您不会想要一个可公开访问的 S3 存储桶。

建议通过 API Gateway + Lambda 请求presigned URL for S3。使用该 URL,只有特定用户才能在定义的时间段(例如 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

【讨论】:

  • 感谢您回答我的问题:) 我听说过 S3 的预签名 url,但我认为在这种情况下我不需要它。我会按照你告诉我的方法试一试。现在我对您的回答还有另一个问题,即数据流。我对您的答案的理解如下,对吗? 1.前端(浏览器)请求后端AWS Lambda获取S3的预签名url。 2. AWS Lambda 将预签名的 url 返回到前端(浏览器)。 3.前端(浏览器)直接上传文件到S3,使用从lambda返回的S3的预签名url。
  • 谢谢你,克里斯,我今天可以完美地解决这个问题,就像你教我的那样。 ^^
【解决方案2】:

您必须将文件直接上传到 s3 到特定的 Bucket,并在此特定 Bucket 上的 s3 上传时创建 lambda 触发事件,

这样每次发送文件时 lambda 都会触发,您可以在那里读取文件并执行您的过程。

请阅读 https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

【讨论】:

  • 感谢您回答我的问题并分享链接!!我将尝试直接从浏览器使用预签名的 url 将文件上传到 S3。和 S3 上传上的 lambda 触发事件似乎真的很有帮助,我也会在我的应用程序中尝试这个:)
猜你喜欢
  • 2021-10-23
  • 2020-10-15
  • 1970-01-01
  • 2019-07-19
  • 2019-11-18
  • 2017-11-30
  • 2017-11-14
  • 2021-03-16
  • 2020-02-26
相关资源
最近更新 更多