我有一个带有两个文件输入字段的简单表单。一个是关于图像,另一个是关于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”两次的原因。但是,不幸的是,我收到了“意外字段”错误消息。
如何实现结果?
聚苯乙烯。关于多个文件上传有很多问题,但没有一个解决我的具体问题。标记这个问题不要太快:)
答案 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('/');
});