我对 Multer 文件名有疑问。
当 multer 以随机文件名存储文件时,是否会出现两个文件在 multer 中同名的情况?
基本上我想说的是,如果我存储大量用户的文件,文件名会重复吗?我可以相信 multer 吗?还是我必须编写一个单独的函数来为每个文件提供唯一的文件名?
从 npm 页面这里,我们可以看到 Multer 在磁盘上存储文件的示例代码:
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 })
文件名用
'-' + Date.now()
连接。 Date.now()
给出从 1970 年 1 月 1 日起的毫秒数。因此,如果两个文件在不同时间保存,它们将具有不同的名称。理论上,如果 2 个文件同时(以毫秒为单位)保存在系统上,它们将具有相同的名称。
因此,这并不取决于您存储的文件数量,而是取决于请求到达系统的速度。如果每秒的请求数超过 1000 个,就有可能出现重复。在这种情况下,您应该使用 UUID 之类的东西。否则,
Date.now()
会完成工作。
阅读有关
Date.now()
的更多信息。const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '../media/');
}
,
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now()+'.'+file.mimetype.split('/')[1]);
}
});
const fileFilter = (req, file, cb) => {
// reject a file
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
cb(null, true);
} else {
cb(null, false);
}
}
const upload = multer({
storage: storage,
limits: {
fileSize: 1024 * 1024 * 5
},
fileFilter: fileFilter
}).single('profile_picture');
每个上传文件的唯一性是通过使用 Date.now() 生成包含当前时间戳(以毫秒为单位)的文件名并将其附加到上传文件的原始字段名来实现的。这种组合确保上传的每个文件,即使它们具有相同的原始名称,也会具有不同的文件名,因为上传时的时间戳会不同。 const multer = require('multer');