我需要通过nYrnfYEv
a4vhAoFG
hwX6aOr7
这样的简短唯一标识来命名上传的文件。我怎样才能确保文件的唯一性?
答案 0 :(得分:16)
(发表我的评论作为答案,回答您的疑虑)
您可能需要查看shortid NPM模块,该模块生成短ID(令人震惊,我知道:))类似于您发布的示例。结果是可配置的,但默认情况下它是一个7到14个字符之间的字符串(长度也是随机的),所有URL友好(正则表达式中为A-Za-z0-9\_\-
)。
回答您(以及其他海报')的疑虑:
答案 1 :(得分:13)
一个选项可能是生成唯一标识符(UUID)并相应地重命名文件。
查看kelektiv/node-uuid
npm模块。
示例:强>
$ npm install uuid
...然后在您的JavaScript文件中:
const uuidv4 = require('uuid/v4'); // I chose v4 ‒ you can select others
var filename = uuidv4(); // '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
每当您执行uuidv4()
时,您都会获得非常新鲜的。
注意:还有其他选择/类型的UUID。阅读模块的文档以熟悉这些文档。
答案 2 :(得分:2)
非常简单的代码。产生一个几乎唯一的文件名 或者如果这还不够,您检查文件是否存在
function getRandomFileName() {
var timestamp = new Date().toISOString().replace(/[-:.]/g,"");
var random = ("" + Math.random()).substring(2, 8);
var random_number = timestamp+random;
return random_number;
}
答案 3 :(得分:-2)
我认为你可能会对真随机和伪随机感到困惑。
伪随机字符串'通常表现出绝对随机性,同时由完全确定的临时过程生成'。这意味着,如果您在加密应用程序中使用这些随机值作为熵,则不希望使用伪随机生成器。
然而,对于您的使用,我相信它会没问题 - 只需检查潜在的(极不可能的)冲突。
您要做的就是创建一个随机字符串 - 不确保它是100%安全且完全随机。
答案 4 :(得分:-2)
尝试以下代码段: -
function getRandomSalt() {
var milliseconds = new Date().getTime();
var timestamp = (milliseconds.toString()).substring(9, 13)
var random = ("" + Math.random()).substring(2, 8);
var random_number = timestamp+random; // string will be unique because timestamp never repeat itself
var random_string = base64_encode(random_number).substring(2, 8); // you can set size here of return string
var return_string = '';
var Exp = /((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+[0-9a-z]+$/i;
if (random_string.match(Exp)) { //check here whether string is alphanumeric or not
return_string = random_string;
} else {
return getRandomSalt(); // call recursivley again
}
return return_string;
}
根据您的要求,文件名可能具有唯一性的字母数字名称。基于当前时间时间戳概念的唯一名称,因为当前时间将来不会重复,为了使其强大,我已应用base64encode将其转换为字母数字。
var file = req.files.profile_image;
var tmp_path = file.path;
var fileName = file.name;
var file_ext = fileName.substr((Math.max(0, fileName.lastIndexOf(".")) || Infinity) + 1);
var newFileName = getRandomSalt() + '.' + file_ext;
由于