1

使用 express.js 上传文件后,它会获得一个新名称(我猜是散列之类的)那么该散列是唯一的吗?我可以将它用作文件 ID,例如在数据库中吗?

4

3 回答 3

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();
于 2013-09-15T19:07:40.003 回答
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 });
    });
});
于 2014-07-13T18:06:19.203 回答
0

我会说文件名大多是唯一的,但总是有可能发生冲突。是来自强大的哈希生成器的来源:

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 ) 发生冲突的机会相同。

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

于 2013-09-15T19:34:44.803 回答