使用 fs 在 multer 中重命名上传的图像

Posted

技术标签:

【中文标题】使用 fs 在 multer 中重命名上传的图像【英文标题】:Rename uploaded image in multer using fs 【发布时间】: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), ...) 【参考方案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 和日期。你能看看我的问题吗这里有完整的代码。 ***.com/questions/65479245/nodejs-multer-aws-s3 嗨,你看我的问题了吗?

以上是关于使用 fs 在 multer 中重命名上传的图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 Multer 重命名上传的文件不起作用 (Express.js)

在颤动中重命名文件/图像

在php中重命名文件夹中所有图像的最佳方法是啥?

如何在 spark scala 中重命名 S3 文件而不是 HDFS

在 Pandas 中重命名多个列

当您在 iTunes 中重命名 Iphone 应用程序时,它不会自动更新