NodeJS Multer唯一文件名

ppcbkaq5  于 2022-11-29  发布在  Node.js
关注(0)|答案(2)|浏览(201)

我对Multer Filename有疑问。
当multer使用随机文件名存储文件时,是否会出现multer中两个文件同名的情况?
基本上,我想说的是,如果我存储大量用户的文件,文件名会重复吗?我可以信任multer吗?或者我必须写一个单独的函数来给予每个文件一个唯一的文件名吗?

oxiaedzo

oxiaedzo1#

从npm页面here中,我们可以看到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日起的毫秒数。因此,如果两个文件在不同时间保存,它们将具有不同的名称。理论上,如果两个文件在完全相同的时间(以毫秒为单位)保存在系统中,它们将具有相同的名称。
因此,它并不取决于你存储了多少文件,而是取决于请求到达你系统的速度。如果你每秒有超过1000个请求,那么就有可能出现重复。在这种情况下,你应该使用UUID之类的东西。否则,Date.now()就可以完成这项工作。

  • 您可以阅读更多关于Date.now()here的信息。
  • 维基百科关于UUID here的页面,如果你需要的话。它也有一个npm包。
xpszyzbs

xpszyzbs2#

const multer = require('multer');

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');

相关问题