express - multer上传多个文件
问题描述
所以,我的架构中有两个属性。1)ImageCover(单个文件)和 2)图像(图像数组)
我正在使用 multer 的 upload.fields 方法来上传这两个文件。当我上传两者时,它可以工作。但是当我尝试只上传其中一个时,我收到错误,即未定义另一个字段。我怎样才能解决这个问题?
1) multer.js
module.exports = () => {
let multer = require('multer')
let myStorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, './uploads/')
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}-${file.originalname}`)
}
})
filter = (req, file, cb) => {
let mimeType = file.mimetype.split('/')[0]
if (mimeType !== 'image') {
req.fileError = true
cb(null, false)
} else {
cb(null, true)
}
}
let upload = multer({
storage: myStorage,
fileFilter: filter
})
return upload
}
2) 上传照片文件
module.exports = function Check(req) {
if (req.files.images) {
req.body.images = []
let allFiles = req.files.images
allFiles.forEach(file => {
let mimeType = file.mimetype.split('/')[0]
if (mimeType !== 'image') {
fs.unlink(path.join(process.cwd(), 'uploads/'), (err, done) => {
if (err) console.log(err)
})
}
req.body.images.push(file.filename)
})
}
if (req.files.imageCover[0]) {
let file = req.files.imageCover[0]
let mimeType = file.mimetype.split('/')[0]
if (mimeType !== 'image') {
fs.unlink(path.join(process.cwd(), 'uploads/'), (err, done) => {
if (err) console.log(err)
})
}
req.body.imageCover = file.filename
}
}
3)创建控制器(检查是我上面导出的功能)
exports.createTour = (req, res, next) => {
check(req)
if (req.fileError) { return next({ error: 'invalid file format dude' }) }
Tour.create({
...req.body,
owner: req.user._id
}).then(result => {
res.status(201).json({
status: 'success',
total: result.length,
result
})
}).catch(err => next(err))
}
4) 路由处理程序
Router.route('/')
.post(authController.protect,
upload.fields([
{
name: 'imageCover', maxCount: 1,
},
{
name: 'images', maxCount: 10
}
]),
tourController.createTour)
解决方案
我认为您收到此错误是因为您尝试访问数组的第一个元素,而数组为空或未定义。
例如:
if (req.files.imageCover[0])
尝试重构为如下所示:
if (req.files.hasOwnProperty("imageCover") && req.files.imageCover.length > 0)
您应该在对象/数组可以是可选的所有地方进行这样的验证
推荐阅读
- elixir - 如何重载相等运算符?
- java - 在动作侦听器中使用时,如果语句不起作用
- android-room - 为什么 Room 要求您列出实体?
- qt - Qt Scale 应用程序分辨率
- r - For 循环每 5 个小数位按 lat 过滤
- javascript - webpack-dev-server 得到编译但没有创建输出文件?
- linux-kernel - 在 linux 2.6 中的 switch_to() 中保存通用寄存器
- javascript - 依次执行所有javascript函数
- ios - 广告标识符 (IDFA)?- 阿德莫布
- libtiff.net - 无法安装包“BitMiracle.LibTiff.NET 2.4.633”...以“.NETFramework,Version=v3.5”为目标的项目