使用 multer 作为中间件从两个字段上传两个文件

问题描述 投票:0回答:3

我试图从两个字段上传两个文件扩展名不同的文件,但是当我用邮递员尝试时,文件的结果总是空的,我的问题的解决方案是什么?这是我的代码

中间件/上传Epub

const multer = require('multer')

exports.uploadEpub = (epubFile, coverFile) => {
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, "uploads")
    },
    filename: function (req, file, cb) {
        cb(null, Date.now() + '-' + file.originalname.replace(/\s/g, ""))
    }
})

const upload = multer({
    storage
}).fields([{name: "bookFile", maxCount: 1},{name: "coverFile", maxCount: 1}])
}

控制器/书

exports.addBook = async (req, res) => {
try {
    const { ...data } = req.body

    const newBook = await book.create({
        ...data,
        bookFile: req.file,
        coverFile: req.file
    })
    let bookData = await book.findOne({
        where: {
            id: newBook.id
        },
        attributes:{
            exclude: ['createdAt','updatedAt']
        }
    })

    bookData = JSON.parse(JSON.stringify(bookData))
    res.send({
        status: "Success",
        Book: {
            ...bookData
        }
    })
} catch (error) {
    console.log(error)
    res.status(500).send({
        status: "Failed",
        message: "Server Error"
    })
}
}
javascript mysql node.js express multer
3个回答
0
投票

Multer 设置

const multer = require('multer')
const path = require('path')
const { nanoid } = require('nanoid')

//Set Storage Engine
const storage = multer.diskStorage({
    destination: './public/uploads/',
    filename: (req, file, callback) => {
        const id = nanoid(6)
        const newFilename = `${file.fieldname}_${id}-${new Date().toISOString().replace(/:/g, '-')}${path.extname(file.originalname)}`
        callback(null, newFilename)
    }
})

const upload = multer({
    storage: storage,
    limits: { fileSize: 5572864 }, // up to 5.5 MB
    fileFilter: (req, file, callback) => {
        checkFileType(file, callback)
    },
})

//Check File Type
const checkFileType = (file, cb) => {
    //Allowed extensions
    const fileType = /jpeg|jpg|png|gif|svg|pdf|epub/

    //Check extension
    const extname = fileType.test(path.extname(file.originalname).toLowerCase())

    //Check mimetype
    const mimetype = fileType.test(file.mimetype)

    if (extname && mimetype) {
        return cb(null, true)
    } else {
        return cb('Error: wrong file type!')
    }
}

module.exports = upload

/***** 中间件.js *****/

module.exports.imageUploader = (req, res, next)=>{
    const files = req.files
    const uploadedFiles = []
    for (var i = 0; i <images.length; i++){
        uploadFiles.push('https://yourserver.com/public/uploads/' + files[i].filename)
    }
    req.uploadFiles = uploadFiles.toString() //appending files to req
    next()
    return
}

/**** index.js or app.js ****/ //你的路由定义的地方

router.post('/books/add', upload.array('images', 10), imageUploader, book.addBook) // allowing up to 10 files to be uploaded, calling imageUploader as a middleware

/*** 控制器/书 ***/

exports.addBook = async (req, res) => {
   const uploadedFiles = req.uploadFiles; //catching files from imageUploader middleware

   // ... rest of your code
}

0
投票

尝试将文件作为表单数据上传到邮递员中,并将与您设置的相同名称的密钥放入multer中,邮递员将如下所示:


0
投票

试试这个:

const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])

app.post('/cool-profile', cpUpload, function (req, res, next) {
})
© www.soinside.com 2019 - 2024. All rights reserved.