javascript - NodeJS - multer - 根据请求属性更改文件名

标签 javascript node.js file-upload multer

我知道我可以通过 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/

相关文章:

javascript - 如何使用 CSS 覆盖 HTML 图像

javascript - Sequelize : A is not associated to B"nodejs

javascript - 当我将 grep 与 Node child_process 一起使用时,结果与 bash 中不同

node.js - Node.js + Express 中的表单上传(通过多方)

mysql - 编辑页面更新问题 -> 覆盖超过应有的内容

laravel - 使用 Dropzone 插件和 Laravel 验证上传多个图像

javascript - Javascript 中的 ERR_INSECURE_RESPONSE 处理提示

php - 如何根据字符串长度更改字体大小?

javascript - 语句评估顺序

node.js - 在 kubernetes 中缓存