我可以使用express.js上传的文件名作为ID吗?

一旦file upload使用express.js它会得到一个新的名字(我猜哈希什么的)那么哈希是唯一的吗? 我可以使用它作为一个文件ID,在一个数据库中说?

我想说的文件名称将是唯一的,但总是有碰撞的机会。 这里是来自强大的哈希生成器的来源:

IncomingForm.prototype._uploadPath = function(filename) { var name = ''; for (var i = 0; i < 32; i++) { name += Math.floor(Math.random() * 16).toString(16); } if (this.keepExtensions) { var ext = path.extname(filename); ext = ext.replace(/(\.[a-z0-9]+).*/, '$1'); name += ext; } return path.join(this.uploadDir, name); }; 

由于Math.floor(Math.random() * 16).toString(16)会给你一个hex值,所以你有一个16 ^ 32的碰撞几率。 这是340282366920938463463374607431768211456中的1 ,与MD5哈希( 2 ^ 128 )的碰撞机率相同。

所以是的,你可以在数据库中使用散列,但很难说。

那你怎么接收这个文件?

我假设你正在使用表单上传? 如果是这样,你看到的散列可能只是临时文件名,你仍然必须将上传的文件写入磁盘(或当然的数据库)。

整个过程在本文中得到了很好的解释: http : //howtonode.org/really-simple-file-uploads

所以在内部expression“bodyparser使用节点强大的select临时文件夹基于这个expression式: process.env.TMP || process.env.TMPDIR || process.env.TEMP || '/tmp' || process.cwd(); process.env.TMP || process.env.TMPDIR || process.env.TEMP || '/tmp' || process.cwd();

只要确定你应该使用encryption节点核心模块提供的散列algorithm之一。

像这个例子一样生成哈希(fileData应该是文件):

 var crypto = require("crypto"); var uniqueID = (crypto.createHash('md5').update(fileData, 'utf8').digest("hex")).toString(); 

你可以使用shortId.generate()生成一个唯一的ID。

 var shortId = require('shortid'); var uniqueFileName = shortId.generate(); fs.rename(file.path, cfg.data + '/uploads/' + uniqueFileName, function(err){ user.profileImage = uniqueFileName; user.save(function(err) { if ( err ) return res.json(400, err); res.json(200, { profileImage: user.profileImage }); }); });