【问题标题】:Rename uploaded image in multer using fs使用 fs 在 multer 中重命名上传的图像
【发布时间】:2016-02-02 19:24:30
【问题描述】:

当用户上传图片时-顺便说一下,我正在使用 multer-名称包含空格,我想在将文件名保存到 Mysql 表之前将空格替换为"-",然后还将已上传的文件重命名为"-" 的新名称。 这是我的代码。它确实重命名并且Mysql表用连字符保存了新名称但是由于某种原因图像没有上传,甚至没有错误,事实上POST请求实际上是成功的。

router.post('/uploadpost', upload.single('image'), function(req, res){
var name = req.file.originalname;
var reName;
if(/\s/g.test(name)){
    reName = name.replace(" ", "-");
    fs.rename(req.file.path, reName, function(err){
        if(err){
            throw err;
        }

    });
}

【问题讨论】:

  • 为什么要使用原始名称?我会担心恶意路径....
  • @mscdex 你建议我做什么?将每个上传的图像重命名为任意字符串?
  • 嗯,目前默认情况下,磁盘存储使用由 16 个十六进制数字组成的随机/唯一文件名保存到磁盘。文件名(不是绝对路径)在 req.file.filename 属性中可用。因此,您可以将其移动到您想要/需要的任何位置。例如:fs.rename(req.file.path, path.join('/my/upload/storage', req.file.filename), ...)

标签: regex node.js express fs multer


【解决方案1】:

为什么在 Multer 保存文件时不更改名称? 类似的东西:

function generateName(){
   return 'newname';
}

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, generateName()); // generate new name 
  }
})

var upload = multer({ storage: storage })

文档 - https://github.com/expressjs/multer#diskstorage

【讨论】:

    【解决方案2】:

    您可以在multer 中轻松更改文件名,如下所示

    const multer = require('multer');
    let fs = require('fs-extra');
    
    let storage = multer.diskStorage({
        destination: function (req, file, cb) {
            let path = `tmp/upload`;
            fs.mkdirsSync(path);
            cb(null, path);
        },
        filename: function (req, file, cb) {
            console.log(file);
            cb(null, file.fieldname + '-' + Date.now() + "." + extension);
        }
    })
    
    var upload = multer({ storage: storage });
    

    在上面的代码中,我给出了这样的文件名file.fieldname fieldname 是您发送图像时使用的字段名称,例如 fieldname 可以是 "image" 或其他任何东西,而不是 - ,Date.now() 上传图像的日期并在文件的最后一个类型或extensionimages-1602486722326.jpeg

    您可以保留图片的原始名称,如下所示

     filename: function (req, file, callback) {
            callback(null, file.originalname);
        }
    

    这将获取文件的原始名称并将其提供给您正在上传的文件 更新 AND 在 MemoryStorage 中

    const upload = multer({
        storage: multerS3({
            s3: s3,
            bucket: 'bucket_name',
            acl: 'public-read',
            key: function (request, file, cb) {
                console.log(file);    |--------------  change name here which you want to use
                                      |              
                cb(null, file.originalname);  use
            }
        })
    }).array('upload', 1);
    

    【讨论】:

    • 您好,如果我使用 memoryStorage 而不是 diskStorage,如何在将原始名称存储到内存之前重命名它?
    • het @kd12345 我已经更新了我的答案,请查看
    • 您好,感谢您回复我,非常感谢。但我的问题是我正在将我的文件转换为 2 种大小并将原始名称存储在我的数据库中。如果可能,我希望所有 3 个都具有相同的 uuid 和日期。你能看看我的问题吗这里有完整的代码。 stackoverflow.com/questions/65479245/nodejs-multer-aws-s3
    • 嗨,你看我的问题了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2016-05-22
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多