使用 express.js 上传文件后,它会获得一个新名称(我猜是散列之类的)那么该散列是唯一的吗?我可以将它用作文件 ID,例如在数据库中吗?
3 回答
那么你是如何接收文件的呢?
我假设您正在使用表格进行上传?如果是这样,您看到的哈希可能只是临时文件名,您仍然必须将上传的文件写入磁盘(当然也可以写入数据库)。
这篇文章很好地解释了整个过程: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();
您可以使用它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 });
});
});
我会说文件名大多是唯一的,但总是有可能发生冲突。这是来自强大的哈希生成器的来源:
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 ) 发生冲突的机会相同。
所以是的,你可以在数据库中使用哈希,但这很难说。