首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Multer-S3从不同的字段发送多个文件到亚马逊S3

如何使用Multer-S3从不同的字段发送多个文件到亚马逊S3
EN

Stack Overflow用户
提问于 2020-02-03 02:33:32
回答 2查看 3.3K关注 0票数 1

我目前使用的是Postman,我需要将来自两个不同字段的两个文件上传到AWS-S3;如下所示:

这是我调用的API路由:

代码语言:javascript
复制
router.route('/').post(uploadThumbnail, uploadVideo, createVideo);

该路由调用三个函数(应该返回从Postman请求的数据):

代码语言:javascript
复制
exports.createVideo = asyncHandler(async (req, res, next) => {
  // Add user to req,body
  req.body.user = req.user.id;
  // Bring files
  if (req.file) {
    console.log(req.file);
  }
});

以下是另外两个函数(使用亚马逊网络服务的上传功能);一个用于缩略图,另一个用于video_url:

代码语言:javascript
复制
const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: process.env.AWS_BUCKET_NAME,
    acl: 'public-read',
    key: function(req, file, cb) {
      const strOne = process.env.WEBSITE_NAME + '-';
      const userId = req.user.id + '-';
      const userEmail = req.user.email + '-';
      const todaysDate = Date.now().toString() + '.';
      const extension = file.mimetype.split('/')[1];
      const finalStr = strOne.concat(userId, userEmail, todaysDate, extension);
      cb(null, finalStr);
    }
  })
});
exports.uploadThumbnail = upload.single('thumbnail');
exports.uploadVideo = upload.single('video_url');

每次我运行post时,Postman都会抛出这个错误:

代码语言:javascript
复制
{
    "status": "error",
    "error": {
        "name": "MulterError",
        "message": "Unexpected field",
        "code": "LIMIT_UNEXPECTED_FILE",
        "field": "video_url",
        "storageErrors": [],
        "statusCode": 500,
        "status": "error"
    },
    "message": "Unexpected field",
    "stack": "MulterError: Unexpected field\n    at wrappedFileFilter (C:\\xampp\\htdocs\\myporn\\node_modules\\multer\\index.js:40:19)\n    at Busboy.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\multer\\lib\\make-middleware.js:114:7)\n    at Busboy.emit (events.js:198:13)\n    at Busboy.EventEmitter.emit (domain.js:448:20)\n    at Busboy.emit (C:\\xampp\\htdocs\\myporn\\node_modules\\busboy\\lib\\main.js:38:33)\n    at PartStream.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\busboy\\lib\\types\\multipart.js:213:13)\n    at PartStream.emit (events.js:198:13)\n    at PartStream.EventEmitter.emit (domain.js:448:20)\n    at HeaderParser.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:51:16)\n    at HeaderParser.emit (events.js:198:13)\n    at HeaderParser.EventEmitter.emit (domain.js:448:20)\n    at HeaderParser._finish (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\HeaderParser.js:68:8)\n    at SBMH.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\HeaderParser.js:40:12)\n    at SBMH.emit (events.js:198:13)\n    at SBMH.EventEmitter.emit (domain.js:448:20)\n    at SBMH._sbmh_feed (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:159:14)\n    at SBMH.push (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:56:14)\n    at HeaderParser.push (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\HeaderParser.js:46:19)\n    at Dicer._oninfo (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:197:25)\n    at SBMH.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:127:10)\n    at SBMH.emit (events.js:198:13)\n    at SBMH.EventEmitter.emit (domain.js:448:20)\n    at SBMH._sbmh_feed (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:188:10)\n    at SBMH.push (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:56:14)\n    at Dicer._write (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:109:17)\n    at doWrite (_stream_writable.js:415:12)\n    at writeOrBuffer (_stream_writable.js:399:5)\n    at Dicer.Writable.write (_stream_writable.js:299:11)"
}

该功能很好用,但只有当发送一个单一的文件时,它可以是缩略图或video_url,但不能两者都有…我需要这两个领域的工作。

有什么办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2020-04-25 19:42:39

代码语言:javascript
复制
  const s3 = new AWS.S3({
    accessKeyId: 'xxxxxxxxx',
    secretAccessKey: 'xxxxxxxxx'
});
  const uploadS3 = multer({

    storage: multerS3({
        s3: s3,
        acl: 'public-read',
        bucket: 'xxxxxxxx',
        metadata: (req, file, callBack) => {
            callBack(null, { fieldName: file.fieldname })
        },
        key: (req, file, callBack) => {
            var fullPath = 'products/' + file.originalname;//If you want to save into a folder concat de name of the folder to the path
            callBack(null, fullPath)
        }
    }),
    limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
    fileFilter: function (req, file, cb) {
        checkFileType(file, cb);
    }
}).array('photos', 10);


exports.uploadProductsImages = async (req, res) => {


    uploadS3(req, res, (error) => {
        console.log('files', req.files);
        if (error) {
            console.log('errors', error);
            res.status(500).json({
                status: 'fail',
                error: error
            });
        } else {
            // If File not found
            if (req.files === undefined) {
                console.log('uploadProductsImages Error: No File Selected!');
                res.status(500).json({
                    status: 'fail',
                    message: 'Error: No File Selected'
                });
            } else {
                // If Success
                let fileArray = req.files,
                    fileLocation;
                const images = [];
                for (let i = 0; i < fileArray.length; i++) {
                    fileLocation = fileArray[i].location;
                    console.log('filenm', fileLocation);
                    images.push(fileLocation)
                }
                // Save the file name into database
                return res.status(200).json({
                    status: 'ok',
                    filesArray: fileArray,
                    locationArray: images
                });

            }
        }
    })
};

票数 1
EN

Stack Overflow用户

发布于 2021-07-28 00:33:48

  • 利用file.fieldname.fields实现

所需的功能

代码语言:javascript
复制
function uploadImageToS3(){
    const multer = require("multer");
    const multerS3 = require("multer-s3");
    const uuid = require("uuid").v4;
    const path = require("path");

    const cloudStorage = multerS3({
      s3: s3Client,
      bucket: process.env.AWS_PRODUCTS_BUCKET,
      acl: "public-read",
      metadata: (req, file, cb) => {
        if (file.fieldname == "thumbnail") {
          const extension = ".jpeg";
          cb(null, `${uuid()}${extension}`);
          return;
        }
        if (file.fieldname == "video_url") {
          const extension = ".jpeg";
          cb(null, `${uuid()}${extension}`);
          return;
        }
        cb(
          "fieldName other than avatar and productImages are not supported",
          null
        );
      },
      // key: name of the file
      key: (req, file, cb) => {
        const extension = path.extname(file.originalname);
        cb(null, `${uuid()}${extension}`);
      },
    });

    const limitFileSize = { fileSize: 1024 * 1024 * 5 }, // 1Byte -->1024Bytes or 1MB --> 5MB
      filterFileType = (req, file, cb) => {
        const isAllowedFileType =
          file.mimetype == "image/jpeg" ||
          file.mimetype == "image/jpg" ||
          file.mimetype == "image/png";

        if (isAllowedFileType) {
          cb(null, true);
          return;
        }
        // To reject this file pass `false`
        cb(null, false);
      };

    const upload = multer({
      storage: cloudStorage,
      limits: limitFileSize,
      fileFilter: filterFileType,
    });
    return upload;
  }

在路由中,像这样使用它

代码语言:javascript
复制
router.post(
  "/upload",
  uploadImageToS3().fields([
    { name: "thumbnail", maxCount: 1 },
    { name: "video_url", maxCount: 1 }
  ]),
  handleImagesUploadController
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60029300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档