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

时间:2018-06-01 10:47:37

标签: node.js express multer

我有一个带有两个文件输入字段的简单表单。一个是关于图像,另一个是关于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>

我需要以不同的方式处理2个不同的文件,这就是我使用“single”两次的原因。但是,不幸的是,我收到了“意外字段”错误消息。

如何实现结果?

聚苯乙烯。关于多个文件上传有很多问题,但没有一个解决我的具体问题。标记这个问题不要太快:)

3 个答案:

答案 0 :(得分:3)

你可以尝试使用像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编辑)

答案 1 :(得分:1)

考虑查看here in this similar question所示的解决方案,它显示了如何将multer提供的upload.fields [...]用于多文件上传,这使您可以更好地控制并定义该字段使用maxCount:是.single或.array。

在服务器下的repo (a nuxt-express-mongodb app)中,我使用multer使用upload.fields [...]从1个帖子请求中上传歌曲/音乐和图像,以查看完整的工作实现。

答案 2 :(得分:1)

您可以在multer存储目标中添加 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('/');

});