首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >multer上传多个文件

multer上传多个文件
EN

Stack Overflow用户
提问于 2020-02-17 00:14:43
回答 1查看 51关注 0票数 0

因此,我的模式中有两个属性。1) ImageCover (单个文件)和2)图像(图像数组)

我正在使用multer的upload.fields方法上传这两个文件。当我上传这两个,它works.But当我尝试上传他们中的任何一个时,我得到的错误是,另一个字段没有定义。我该如何解决这个问题呢?

1) multer.js

代码语言:javascript
复制
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)上传照片文件

代码语言:javascript
复制
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)创建控制器(check是我在上面导出的函数)

代码语言:javascript
复制
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)路由处理程序

代码语言:javascript
复制
Router.route('/')    
.post(authController.protect,
    upload.fields([
        {
            name: 'imageCover', maxCount: 1,
        }, 
        {
            name: 'images', maxCount: 10
        }
    ]),
    tourController.createTour)

response in postman when I only select images

EN

回答 1

Stack Overflow用户

发布于 2020-02-17 23:33:02

我认为你得到这个错误是因为你试图访问数组的第一个元素,而数组是空的或者没有定义。

例如:

代码语言:javascript
复制
 if (req.files.imageCover[0])

尝试重构如下所示:

代码语言:javascript
复制
if (req.files.hasOwnProperty("imageCover") && req.files.imageCover.length > 0)

您应该在对象/数组可以是可选的所有位置上执行类似的验证

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60250486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档