1

我想更改我的文件名,但是当我检查 console.log( req.file) 时,我可以看到我更改为的文件名,但是使用Multergridfs Storage.

 1. the default filename 
 const storage = new GridFsStorage({
    url: config.db,
    file: (req, file) => {
        return new Promise((resolve, reject) => {
            crypto.randomBytes(16, (err, buf) => {
                if (err) {
                    return reject(err)
                }
                const filename = 'file' + path.extname(file.originalname);
                const fileInfo = {
                    filename: filename,
                    bucketName: 'contents'
                };
                resolve(fileInfo);
            });
        });
    }});

2 this is where i edited the filename

router.post('/', upload.single('file'), (req, res) => {
    req.file.filename = req.body.fileName + path.extname(req.file.originalname)
    res.redirect('/upload/files')
    
    console.log(req.file)
});

控制台的结果类似于

{ fieldname: 'file', originalname: '\'YOU ALSO BE GREAT\' - Elon Musk Motivation - Motivational Video.mp4', encoding: '7bit', mimetype: 'video/mp4', id: 5bfb292c13eec142f6c20fd9, filename: 'a.mp4',元数据:null,bucketName:'contents',chunkSize:261120,大小:19372377,md5:'513c6220ef3afff644cf8a6dc4cd9130',uploadDate:2018-11-25T22:58:52.625Z,contentType:'video/mp4' } { 文件名:'a' }

4

1 回答 1

2

您代码中的这一部分

const storage = new GridFsStorage({
    url: config.db,
    file: (req, file) => { // In this function is where you configure the name of your file

file配置是在将文件插入数据库之前计算文件名的配置。你正在做的是:

  1. 生成一个名称,例如'file'加上来自浏览器的任何扩展名,例如:'file.mp4'
  2. 将具有该名称的文件保存到数据库中
  3. 用新名称覆盖请求中的属性
  4. 数据库中的文件保持不变

我认为您真正想要的是在插入之前生成正确的名称

您可以使用

const storage = new GridFsStorage({
    url: config.db,
    file: (req, file) => {
        return new Promise((resolve, reject) => {
            crypto.randomBytes(16, (err, buf) => {
                if (err) {
                    return reject(err)
                }
                // In here you have access to the request and also to the body object
                const filename = req.body.fileName + path.extname(file.originalname);
                const fileInfo = {
                    filename: filename,
                    bucketName: 'contents'
                };
                resolve(fileInfo);
            });
        });
    }});

确保您在浏览器中的表单中发送文件之前的所有字段,否则某些值将是undefined因为它们尚未处理。

于 2018-11-27T15:37:01.427 回答