我可以使用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 }); }); });
- 用mongoose在mongodb中存储图像? 如何?
- 得到错误的请求而不是完整的错误信息
- res.send发送后无法设置标题
- 用NodeJS Multer转换上传
- 你可以使一个JavaScript的正则expression式失败,而不是传递时发现匹配?
- 当HOST在app.listen(PORT,HOST)中设置时,app.address()如何为空;
- 关于用MEAN Stack创build多租户SAAS应用程序的build议(Mongodb,express,angular,node)
- 创buildReact App + Express.js + Passport.jslogin问题
- expressionjs错误:“明确反对res.sendfile:使用res.sendFile”