javascript - 如何在处理程序之外调用 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
和变量以使它们生效,就好像我在函数调用之后更改它们一样,文件已经上传了。fileName
upload.single()
有没有办法upload.single()
在进行上述更改后调用函数,或者它是否必须是app.post()
函数的参数 - 如果是这样,是否有解决方法来实现我想要的?
解决方案
推荐阅读
- c - 如何将我的 main.c 文件与我的库 .a 文件链接?
- c# - 为什么格式化程序是 BinaryFormatter 它无法正确处理 IDeserializationCallback
- laravel-8 - 未找到 Laravel 密码重置令牌
- java - Gradle 已安装,但 Cordova 没有看到它
- sql - 根据每个国家/地区的预定义份额将固定价值拆分到国家/地区
- typescript - 打字稿:尝试为 redux 商店构建自动完成功能
- r - 从工作流中导出汇总模型
- c# - .NET 反应式合并列表
- assembly - 在汇编中从 argv 读取整数
- python - 在 Python 中绘制时间堆叠的波形