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('/');
});
我有一个带有两个文件输入字段的简单表单。一个是关于图片的,另一个是关于 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 编辑)
考虑查看显示的解决方案
或
查看服务器下的 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('/');
});