Multer 独特的文件名

问题描述 投票:0回答:2

我对 Multer 文件名有疑问。

当 multer 以随机文件名存储文件时,是否会出现两个文件在 multer 中同名的情况?

基本上我想说的是,如果我存储大量用户的文件,文件名会重复吗?我可以相信 multer 吗?还是我必须编写一个单独的函数来为每个文件提供唯一的文件名?

javascript node.js npm multer
2个回答
9
投票

从 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()的更多信息。
  • 有关 UUID 的维基百科页面这里,以防您需要。它还有一个 npm 包。

2
投票
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');

© www.soinside.com 2019 - 2024. All rights reserved.