【问题标题】:uploading two files from two fields with multer as middleware使用 multer 作为中间件从两个字段上传两个文件
【发布时间】:2023-02-21 03:19:35
【问题描述】:

我正在尝试使用 multer 从两个字段上传两个具有不同文件扩展名的文件,但是当我尝试使用邮递员时,文件的结果始终为空,我的问题的解决方案是什么?这是我的代码

中间件/上传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


    【解决方案1】:

    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
    

    /***** middlewares.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 ****/ //where your routes are defined

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

    /*** Controllers/book ***/

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我已经尝试将其作为表单数据上传,但结果仍然相同this is the result
      • 你不能将文件传递给期望提供它的主体,你应该像处理静态内容一样处理它,看看这里:expressjs.com/pt-br/starter/static-files.html,最后一件事,文件已保存到上传文件夹?因为您可能需要先创建文件夹。
      【解决方案3】:

      尝试这个

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

      app.post('/cool-profile', cpUpload, function (req, res, next) { })

      【讨论】:

        猜你喜欢
        • 2017-01-13
        • 2016-12-09
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 1970-01-01
        • 2018-11-13
        • 2020-05-31
        相关资源
        最近更新 更多