首页 > 解决方案 > 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)

当我只选择图像时邮递员的响应

标签: expressmulter

解决方案


我认为您收到此错误是因为您尝试访问数组的第一个元素,而数组为空或未定义。

例如:

 if (req.files.imageCover[0])

尝试重构为如下所示:

if (req.files.hasOwnProperty("imageCover") && req.files.imageCover.length > 0)

您应该在对象/数组可以是可选的所有地方进行这样的验证


推荐阅读