使用 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()
上传图像的日期并在文件的最后一个类型或extension
前images-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)