gpt4 book ai didi

php - 如何确保上传到服务器的图像的文件名唯一?

转载 作者:搜寻专家 更新时间:2023-10-31 20:40:57 27 4
gpt4 key购买 nike

我正在创建一个允许用户将图像上传到服务器的网络应用程序。

如何在用户上传图片时防止重复的图片文件名?

如何将文件名更改为不与任何先前图片名称(或可能上传的下一张图片)重复的唯一名称?

编辑:

如果我使用主键自动增量作为每个图像的图像文件名?有用吗?

最佳答案

already answered以前这样的问题。我更新了我的代码,为生成的 ID 添加更多随机性(熵)。

此类生成伪唯一、非顺序、非数字 ID。

class IdGenerator {

static private function _nextChar() {
return base_convert(mt_rand(0, 35), 10, 36);
}

static public function generate() {
$parts = explode('.', uniqid('', true));

$id = str_pad(base_convert($parts[0], 16, 2), 56, mt_rand(0, 1), STR_PAD_LEFT)
. str_pad(base_convert($parts[1], 10, 2), 32, mt_rand(0, 1), STR_PAD_LEFT);
$id = str_pad($id, strlen($id) + (8 - (strlen($id) % 8)), mt_rand(0, 1), STR_PAD_BOTH);

$chunks = str_split($id, 8);

$id = array();
foreach ($chunks as $key => $chunk) {
if ($key & 1) { // odd
array_unshift($id, $chunk);
} else { // even
array_push($id, $chunk);
}
}

// add random seeds
$prefix = str_pad(base_convert(mt_rand(), 10, 36), 6, self::_nextChar(), STR_PAD_BOTH);
$id = str_pad(base_convert(implode($id), 2, 36), 19, self::_nextChar(), STR_PAD_BOTH);
$suffix = str_pad(base_convert(mt_rand(), 10, 36), 6, self::_nextChar(), STR_PAD_BOTH);

return $prefix . self::_nextChar() . $id . $suffix;
}
}

如果你执行这个脚本

header('Content-type: text/plain; charset=utf-8');

for ($i=0; $i<10; $i++) {
$uid = IdGenerator::generate();

echo $uid . " = " . strlen($uid) . "\n";
}

你会得到这样的东西:

x0i8eea3c8kw4lgudmoss4c4w03db6wl = 32
byqrfgc6hilr9d1ot4wow8gw4syugtvz = 32
ta075al22zp3v6awtlw4kgkk446mjbiv = 32
hqqa90p27e9desx99q8skokcc46fujx4 = 32
uqc000q7g20l1k9zlwko80gsow5e59e7 = 32
gxx2r5d5oa0p8iykvc4ckgc4kc0teekv = 32
ayysoos5ltfua3d0m80ccocc0kcfhqyb = 32
dtj31vi4tzmh6lhk1iccc0os4cgsze1e = 32
fvn41hh2gnk6lbrq4w0wwgko8k5ihda8 = 32
oxamsba3qh0ro6xehkw8cg400s10tiyq = 32

** 编辑 **

那么,为什么会这样呢?为什么不直接使用 uniqid()?因为 uniqid() 是顺序的并且是可预测的。因为你需要添加更多的熵。此类不仅使用 uniqid()“更多熵”参数,还使用 ​​mt_rand() 来填充生成的值。此处提供的类也将始终生成一个 32 字节(256 位)的字符串。

这个函数有多随机?要获得重复 ID,需要在准确 的同一时间调用 uniqid(),而 mt_rand() 需要返回完全相同顺序的相同随机值...连续七次。底线是它是相当随机的。

** 编辑 2 **

您可能还对 pure PHP UUID 感兴趣实现。

** 编辑 3 **

使用主键 (PK) 作为唯一文件名的问题在于它是可预测的。如果您打算直接从 URI 路由提供这些文件,那么生成的非顺序值会更安全。如果您打算以其他方式提供这些文件,那么无论如何都必须为这些文件分配一些唯一的 key ......并且由于完全相同的原因,该 key 不能按顺序排列。因此,无论用例如何,使用非顺序唯一键作为文件名都是一个好主意。

关于php - 如何确保上传到服务器的图像的文件名唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22002812/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com