首页 > 解决方案 > 如何在处理程序之外调用 multer 上传函数

问题描述

我想在我的快速应用程序中使用 multer 动态设置上传文件的存储目标,以及文件的名称。我有一个处理 post 请求的快速路由,如图所示:

EJS:

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="somename">
    <select name="p">
        <option selected>ABC</option>
        <option>DEF</option> 
    </select>
    <input type="number" name="dtYear" value="2020">
    <button type="submit">Upload</button>
</form>

ExpressJS:

let storageDest = './public/content/dts/' ;
let fileName;
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, storageDest)
        console.log(file);
    },
    filename: (req, file, cb) => {
        if (fs.existsSync(storageDest + file.originalname)){
            fileName = file.fieldname + Date.now() + path.extname(file.originalname)
        } else{
            fileName = file.originalname;
        }

        cb(null, fileName)
    }
})

const upload = multer({storage: storage})

app.post('/upload', upload.single('somename'), (req, res, next) => {
    storageDestiantion += req.body.p.toLowerCase() + '/';
    fileName = req.body.dtYear;
    res.send('Thank you for uploading!')
})

但是,我只能在调用multer 函数之前更改storageDestination和变量以使它们生效,就好像我在函数调用之后更改它们一样,文件已经上传了。fileNameupload.single()

有没有办法upload.single()在进行上述更改后调用函数,或者它是否必须是app.post()函数的参数 - 如果是这样,是否有解决方法来实现我想要的?

标签: javascriptexpressfile-uploadmulter

解决方案


推荐阅读