node.js multer重命名上传的文件

问题描述 投票:0回答:2

我正在尝试通过请求参数重命名使用 multer 上传的图像文件。

这是我的代码:

router.route('/upload/:userid')
.post(multer({
    dest: 'uploads/'
    }), function(req,res){
            fs.readFile('uploads/' + req.files.file.name, function(err, data) {
                fs.writeFile('uploads/' + req.params.userid + '.' + req.files.file.extension, data, function(err) {
                    fs.unlink('uploads/' + req.files.file.name, function(){
                        if(err) throw err;
                    });
                }); 
            });
            res.json({ message: 'Successfully uploaded image!' });
});

它工作得很好,但我想知道它是否存在带有 multer 重命名功能的更干净、更简单的东西。

它已经尝试过这样的事情:

router.route('/upload/:userid')
.post(multer({
    dest: 'uploads/',
    rename: function(req,res) {
        return req.params.userid
    }
    }), function(req,res){
            res.json({ message: 'Successfully uploaded image!' });
});

但是它不起作用,因为 req 尚未填充(未定义)。

我使用 httpie 通过以下命令测试我的代码:

http.exe -f POST http://localhost:8080/upload/171284 file@D:\....\cat.jpg

是否可以使用 multer 的重命名功能来完成我对 fs 所做的事情? 或者有更好的办法吗?

感谢您的反馈。

托马斯

编辑

我使用diskStorage的新代码:

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
    filename: function (req, file, cb) {
    cb(null, req.params.userid + '-')
  }
})

var upload = multer({ storage: storage })

router.route('/upload/:userid')
    .post(multer({
        storage: storage
    }), function(req,res){
        res.json({ message: 'Successfully uploaded image!' });
});

这会引发错误:

Error: Route.post() requires callback functions but got a [object Object]
node.js multer
2个回答
3
投票

Multer 构造函数中没有

rename
,相反,
DiskStorage
中有一个 filename

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})

var upload = multer({ storage: storage })

filename
用于确定文件内部应命名为什么 文件夹。如果没有给出
filename
,每个文件都会被赋予一个 不包含任何文件扩展名的随机名称。


0
投票

可以这样更改文件名

const crypto = require("crypto");
const multer = require('multer');
const storage = multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './' + process.env.UPLOAD_PATH); // Destination folder for uploaded files
  },
  filename: function (req, file, callback) {
    let extension = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
    callback(null, crypto.randomUUID() + extension); // rename filename
  }
});
const ticketServiceFileUpload = multer({ storage: storage }).any('files');
module.exports = fileUploadService;

路由器

router.post('/path',fileUploadService, yourController.functionName);
© www.soinside.com 2019 - 2024. All rights reserved.