如何在nodejs中为上传的文件生成简短的唯一名称?
我需要通过简短的唯一标识符来命名上传的文件,如nYrnfYEv
a4vhAoFG
hwX6aOr7
。 我怎样才能确保文件的唯一性?
(发表我的意见作为回答,回应你的顾虑)
您可能想要查看shortid NPM模块,它会生成与您正在发布的示例类似的简短ID(令人震惊,我知道:)。 结果是可configuration的,但是默认情况下它是一个7到14个字符的string(长度是随机的),所有URL友好的(正则expression式)。
为了回答你(和其他海报)的关注:
- 除非你的服务器有一个真正的随机数发生器(极不可能),否则每个解决scheme都将使用一个PRNG(伪随机数发生器)。 shortid使用Node.jsencryption模块来生成PRNG数字,然而,这是一个比Math.random()更好的生成器。
- shortid不是连续的,这使得猜测它们更加困难
- 虽然shortid不能保证是唯一的,碰撞的可能性是非常小的。 除非您每年生成数十亿条条目,否则您可以放心地认为碰撞永远不会发生。
- 在大多数情况下,依靠概率来相信碰撞不会发生就足够了。 如果你的数据太重要了,即使这么小的风险,你也可以通过给它加上一个时间戳来使shortid 基本上是 100%唯一的。 作为一个额外的好处,文件名将更难以猜测。 (注意:我写了“基本上是100%独特的”,因为如果在同一个时间戳中生成两个条目,理论上可能会发生冲突,也就是说同一秒。但是,我绝对不会关心这个。真正100%确定你唯一的select是对数据库或文件系统进行检查,但是这需要更多的资源。)
- shortid之所以不能做到这一点,是因为对于大多数应用来说,碰撞的可能性太小而不被关注,拥有尽可能短的id更重要。
你需要一些东西来生成唯一的标识符:UUID; 看看这个npm 模块 。 不知道为什么你需要短名称,但在任何时候你可以缩短返回的UUID到你想要的字符数。
例:
$ sudo npm install node-uuid
…然后在你的JavaScript文件中:
var uuid = require('node-uuid'); // Generate a v4 (random) UUID var filename = uuid.v4(); // filename -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
任何时候,你执行uuid.v4()
你会得到一个非常新鲜的 。 之后,如果你不喜欢那些冗长的名字,你可以修剪成X
字符。
尝试下面的代码片段: –
function getRandomSalt() { var milliseconds = new Date().getTime(); var timestamp = (milliseconds.toString()).substring(9, 13) var random = ("" + Math.random()).substring(2, 8); var random_number = timestamp+random; // string will be unique because timestamp never repeat itself var random_string = base64_encode(random_number).substring(2, 8); // you can set size here of return string var return_string = ''; var Exp = /((^[0-9]+[az]+)|(^[az]+[0-9]+))+[0-9a-z]+$/i; if (random_string.match(Exp)) { //check here whether string is alphanumeric or not return_string = random_string; } else { return getRandomSalt(); // call recursivley again } return return_string; }
根据您的要求,文件名可能包含唯一性的字母数字名称。 基于当前时间的时间戳概念的唯一名称,因为当前时间不再重复自己,为了使它强大,我已经应用了base64encode将它转换成字母数字。
var file = req.files.profile_image; var tmp_path = file.path; var fileName = file.name; var file_ext = fileName.substr((Math.max(0, fileName.lastIndexOf(".")) || Infinity) + 1); var newFileName = getRandomSalt() + '.' + file_ext;
谢谢
我想你可能会对真随机和伪随机感到困惑。
伪随机string“典型地performance为统计随机性,而由完全确定性的临时过程产生”。 这意味着,如果您将这些随机值用作密码应用程序中的熵,则不需要使用伪随机生成器。
但是,为了您的使用,我相信这样会很好 – 只要检查潜在(极不可能)的冲突。
所有你想要做的是创build一个随机string – 不确保它是100%安全和完全随机的。
- 使用aws-sdk将svresize的图像上传到s3
- 错误在使用“vaadinfile upload”(聚合物)通过nodejs与express
- 如何在Formidable(Node.js)中取消用户上传?
- 在nodejs上评估file upload器 – 多个file upload
- file upload挂在生产代码上,但在本地工作 – multer,node.js
- 服务器在VPS上上传video或图像时重新启动 – NodeJS Forever
- 使用req.files上传文件不能使用Express 4.x
- 跟踪客户端上的Nodejs服务器进度
- 在通过file.createWriteStream()传输到GCP时,获取ESOCKETTIMEOUT,ECONNRESET或套接字会挂载大文件。