我正在尝试将 multipart / form-data 表单发送给 AWS-Lambda 方法。 我需要能够将文件发送到 S3 ,并且需要使用传入的字符串参数将元数据记录到RDS。
现在,我可以使用 express 和 multer-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吗?如果答案是否定的,或者不建议这样做,请您指出正确的方向吗?
谢谢..
答案 0 :(得分:1)
我知道问题发布已经有一段时间了,但是为了将来可能会在这里出现的人们:
简短答案:不建议使用。为什么?对于作为表单数据一部分发送的文件有一些奇怪的处理,不确定是通过API Gateway还是通过S3。我花了整整一天的时间尝试使用与您提到的方法类似的方法从SPA Angular应用程序上传图像,但我无法使其工作:我能够访问请求中的文件,该文件先前是Multer解析的,并有效地将它们放到S3存储桶中,但是图像损坏了。不知道它是否适用于其他类型的文件,但是这种方法需要更多的工作,而且感觉有些棘手。 从您的AWS账户外部(即不使用任何AWS Service或EC2实例)将文件上传到S3存储桶的最佳,最简便的方法是,IMO使用Presigned URLs。 您可以检查this article可能会指出正确的方向。
也就是说,您可以configure API Gateway to allow your Lambda to receive binary files。如果您使用的是无服务器,则以下是一个使事情变得更轻松的插件:https://github.com/maciejtreder/serverless-apigw-binary