一旦使用express.js上传文件,它就会获得一个新名称(我想是一个哈希或者什么)那么哈希是唯一的吗?我可以将它用作文件ID,比如dababase吗?
答案 0 :(得分:1)
那你怎么收到这个文件?
我假设您正在使用表单进行上传? 如果是这样,您看到的哈希可能只是临时文件名,您仍然必须将上载的文件写入磁盘(当然还是数据库)。
本文中详细解释了整个过程:http://howtonode.org/really-simple-file-uploads
所以内部表达'bodyparser使用node-formidable,它根据这个表达式选择临时文件夹:process.env.TMP || process.env.TMPDIR || process.env.TEMP || '/tmp' || process.cwd();
确保您应该使用加密节点核心模块提供的哈希算法之一。
生成类似于此示例的哈希值(fileData应该是文件):
var crypto = require("crypto");
var uniqueID = (crypto.createHash('md5').update(fileData, 'utf8').digest("hex")).toString();
答案 1 :(得分:1)
您可以使用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 });
});
});
答案 2 :(得分:0)
我会说文件名主要是将是唯一的,但总有可能发生冲突。 Here是来自formidable的哈希生成器的来源:
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)
会为您提供十六进制值,因此您有 16 ^ 32 的碰撞机会。 340282366920938463463374607431768211456 中 1 ,这与MD5哈希( 2 ^ 128 )发生冲突的几率相同。
所以是的,您可以在数据库中使用哈希,但很难说。