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

时间:2013-09-15 18:55:35

标签: node.js express

一旦使用express.js上传文件,它就会获得一个新名称(我想是一个哈希或者什么)那么哈希是唯一的吗?我可以将它用作文件ID,比如dababase吗?

3 个答案:

答案 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 )发生冲突的几率相同。

所以是的,您可以在数据库中使用哈希,但很难说。