使用 multer 上传 Nest js / Node js 文件:将文件流传递给函数处理程序

问题描述 投票:0回答:1

Multer 从可读流中的请求中获取文件,并且使用默认引擎,我们可以将文件保存在磁盘或 RAM 中。之后,可以在转到路由处理程序的文件对象中访问它。就我而言,我想将文件上传到 S3,因此我需要访问流,但无法在处理程序函数中获取该流。

此问题描述了如何通过创建自定义引擎或使用库来解决该问题:https://github.com/aws/aws-sdk-js-v3/issues/5479.

这是一个有效的解决方案,但我不喜欢我必须在装饰器中传递自定义引擎。我正在开发一个 Nest.js 应用程序,并且有一个单独的模块和类可以与 AWS S3 一起使用,它有自己的依赖项。由于我必须在装饰器中传递自定义引擎,这意味着我必须重新创建所有依赖项,这不是 Nest 的处理方式。

我尝试开发一个自定义引擎,并正在寻找配置选项 - 什么都没有。

我正在寻找一种将可读流传递给处理程序的方法。提前回答 - 保存在磁盘上、创建可读流以及删除文件不是一个选项。

javascript node.js nestjs multer nodejs-stream
1个回答
0
投票

您可以使用

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。

© www.soinside.com 2019 - 2024. All rights reserved.