Multer 从可读流中的请求中获取文件,并且使用默认引擎,我们可以将文件保存在磁盘或 RAM 中。之后,可以在转到路由处理程序的文件对象中访问它。就我而言,我想将文件上传到 S3,因此我需要访问流,但无法在处理程序函数中获取该流。
此问题描述了如何通过创建自定义引擎或使用库来解决该问题:https://github.com/aws/aws-sdk-js-v3/issues/5479.
这是一个有效的解决方案,但我不喜欢我必须在装饰器中传递自定义引擎。我正在开发一个 Nest.js 应用程序,并且有一个单独的模块和类可以与 AWS S3 一起使用,它有自己的依赖项。由于我必须在装饰器中传递自定义引擎,这意味着我必须重新创建所有依赖项,这不是 Nest 的处理方式。
我尝试开发一个自定义引擎,并正在寻找配置选项 - 什么都没有。
我正在寻找一种将可读流传递给处理程序的方法。提前回答 - 保存在磁盘上、创建可读流以及删除文件不是一个选项。
您可以使用
multer-s3
包来处理这种情况。它允许您通过 multer
直接将文件流式传输到 S3。你可以这样使用它
import * as multer from 'multer';
import * as multerS3 from 'multer-s3';
import * as AWS from 'aws-sdk';
AWS.config.update({
accessKeyId: 'your-access-key-id',
secretAccessKey: 'your-secret-access-key',
region: 'your-region'
});
const s3 = new AWS.S3();
const upload = multer({
storage: multerS3({
s3: s3,
bucket: 'your-bucket-name',
acl: 'public-read',
key: function (request, file, cb) {
cb(null, `${Date.now().toString()}-${file.originalname}`);
}
})
});
// In your route
app.post('/upload', upload.array('photos', 3), function (req, res, next) {
// req.files is array of `photos` files
// req.body will contain the text fields, if there were any
res.send('Successfully uploaded!');
});
这样,您就不必手动处理流,并且文件不会保存到磁盘或 RAM 中。它直接流式传输到 S3。