2

我正在尝试将multipart/form-data表单发送到AWS-Lambda方法。我需要能够将文件发送到S3,并使用传入的字符串参数,我需要将元数据记录到 RDS。

现在,我可以使用expressmulter-s3来做到这一点,如下所示;

var express = require('express');
var AWS = require('aws-sdk');
var multer = require('multer')
var multerS3 = require('multer-s3')

var s3 = new AWS.S3();
const app = express();

var upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'my-bucket-name',
    metadata: function (req, file, cb) {
      cb(null, Object.assign({}, req.body));
    },
    key: function (req, file, cb) {
      cb(null, Date.now().toString() + '.fileExtension')
    }
  })
})

app.post('/data', upload.array('file'), function(req, res, next) {
  // here using req.files, i can save metadata to RDS
})

我的问题是,是否可以在 AWS Lambda 方法中使用 multer-s3?如果答案是否定的,或者不推荐,请您指出正确的方向吗?

谢谢..

4

1 回答 1

8

我知道问题发布已经有一段时间了,但是为了将来可能会在这里结束的人们:

简短的回答:不推荐。为什么?作为表单数据的一部分发送的文件有一些奇怪的处理,不确定它是通过 API Gateway 还是 S3。我花了一整天的时间尝试使用与您提到的方法类似的方法从 SPA Angular 应用程序上传图像,但我无法让它工作:我能够访问请求中的文件,之前由 Multer 解析,并有效地将其中的每一个放入 S3 存储桶,但图像已损坏。不确定它是否适用于其他类型的文件,但这种方法需要更多的工作,而且感觉有点 hacky。从您的 AWS 账户(即,不使用任何 AWS 服务或 EC2 实例)将文件上传到 S3 存储桶的最佳和最简单的方法是,IMO,使用预签名 URL。你可以查看这篇文章这可能会为您指明正确的方向。

也就是说,您可以配置 API Gateway 以允许您的 Lambda 接收二进制文件。如果您使用的是无服务器,以下是一个插件,可以让事情变得更容易:https ://github.com/maciejtreder/serverless-apigw-binary

于 2019-01-30T19:34:56.023 回答