Multer:在不同的文件夹中上传不同的文件类型

Multer: upload different file types in different folders

我有一个带有两个文件输入字段的简单表单。一个是关于图片的,另一个是关于 mp3 文件的。

我有一个使用 multer 作为文件上传系统的快速服务器。我想将图像保存在 img 中,将 mp3 文件保存在 music 文件夹中。

这是我到目前为止尝试过的:

var musicUpload = multer({dest: 'music'});
var imgUpload = multer({dest: 'img'});

app.post('music', 
         musicUpload.single('music'), 
         imgUpload.single('img'), 
         function (req, res) {
             ...
         });

虽然是这样的形式:

<form action="post" enctype="multipart/form-data" action="music">
    <input type="file" id="img" name="img">
    <input type="file" id="music" name="music">
    <input type="submit" value="Send">
</form>

我需要以不同的方式处理这两个不同的文件,这就是我使用 "single" 两次的原因。但是,不幸的是,我收到一条 "Unexpected field" 错误消息。

怎样才能达到这个效果?

Ps。 SO 上有很多关于多个文件上传的问题,但其中 none 解决了我的具体问题。不要太快提出这个问题 :)

您可以尝试使用 DiskStorage 之类的东西。根据他们的文档:https://github.com/expressjs/multer

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    if (file.mimetype === 'audio/mp3') {
      cb(null, 'songs')
    } else if (file.mimetype === 'image/jpeg') {
      cb(null, 'img')
    } else {
      console.log(file.mimetype)
      cb({ error: 'Mime type not supported' })
    }
  }
})


var upload = multer({ storage: storage })

然后在端点本身做:

var upload = multer({storage}); 
  router.post('/song', upload.any(), function(req, res) { 
  ...  
});

这可能比您的方法更清晰,我认为它提供了您正在寻找的功能,因为它使您可以更精细地控制保存这些文件。 (由@cristian 编辑)

考虑查看显示的解决方案 ,它展示了如何使用 multer 提供的 upload.fields[...] 进行多文件上传,让您有更多的控制权使用 maxCount:.

定义字段是 .single 还是 .array

查看服务器下的 repo (a nuxt-express-mongodb app),我使用 multer 从 1 post 请求上传 song/music 和图像,使用 upload.fields[...] 查看完整的工作实施。

您可以在多个存储目标中添加 if else 语句 并使用 file.fieldname 确定您的输入字段名称并存储它在不同的文件夹中。

var storage = multer.diskStorage({
    destination: function (req, file, cd) {
        if (file.fieldname === 'img') {
            cd(null, '/img');
        }

        else if (file.fieldname === 'music') {
            cd(null, '/music');
        }
        
    },

    filename: function (req, file, cd) {
      cd(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

var upload = multer({storage: storage});

在您的 post 方法中,这将是可靠的合作伙伴。 reference

var cpUpload = upload.fields([{ name: 'img', maxCount: 1 }, { name: 'music', maxCount: 1 }]);
app.post('/music', cpUpload, function (req, res, next) { 

    console.log(req.file, req.body);
    res.redirect('/');

});