我知道我可以通过 multer 通过存储对象更改文件名,如下所示:
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, process.env.UPLOAD_DIR);
},
filename: (req, file, cb) => {
cb(null, 'bla.png');
}
});
const upload = multer({ storage: storage } );
我的请求除了有文件外,还有一些文本属性,比如name: myPic.png
。
是否可以根据其他请求属性或在 Controller 内动态更改文件名,如下所示:
filename: (req, file, cb) => {
cb(null, `${req.body.name}.png`);
}
或
router.post('/upload', upload.single('pic'), myController.upload);
/* in controller */
upload = async (req: Request, res: Response) => {
try {
/* change the filename of multer here? */
} catch (err) {
winston.error(`Error while uploading: ${err.message}`);
winston.error(`Stack trace: ${err.stack}`);
sendJSONResponse(res, err, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
最佳答案
Multer 是填充 req.body
和存储文件的中间件。
此外,当它到达 filename()
函数时,不能保证文本字段将填充到 req.body
中,因为它取决于哪个顺序客户sends them in (见最后的注释)。
据我所知,您有两个选择:
1) 在 multer 上传中间件完成它的工作并填充 req.body
以及 req.file
后重命名上传的文件。所以在你的 Controller 上传中间件中,你会做类似的事情:
if (req.file) {
fs.renameSync(req.file.path, req.file.destination + req.body.name);
}
2) 将请求正文文本字段更改为查询参数。然后,在 filename()
中,您可以执行 req.query.name
。
缺点:不是一个非常 RESTful 的设计,但也许这对您来说不是那么重要。
关于javascript - NodeJS - multer - 根据请求属性更改文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487001/