PHP 会再次使用用过的 tmp_name 吗?

Will PHP Use a Used tmp_name Again?

我的网站上有一个文件上传系统已经有很长时间了。在这段时间里,我意识到许多用户上传的文件包含相同的名称但彼此不同。由于名称相同,上传失败! 我决定不再使用 $_FILES['file']['name'] 作为文件名。

在我的例子中,$_FILES['file']['tmp_name'] 的随机 echo 看起来像 /tmp/phpynIF3G。我将使用 $_FILES['file']['tmp_name'] 作为文件名。

比如,一开始是$filename = $_FILES['file']['name'];,现在是$filename = str_replace("/tmp/php","",$_FILES['file']['tmp_name']).".jpg";。 因此,当文件成功上传到我的 /e/ 目录时,可以通过 url 即 https://sitename/e/ynIF3G.jpg.

访问它

如果 Php 已经使用过 /tmp/phpynIF3G 一次,它会再次对其他文件使用相同的 tmp_name 吗?

是的,有可能,tmp != unique

避免使用 tmp_name 作为其名称,要么使用其真实名称,要么对文件进行哈希处理以获取其校验和(> sha256),然后使用它,如果您希望它简短,只需将其存储为自动递增的数,然后使用 base_convert(), or a lib like hashids.

如果每个用户都上传了一个名为 XYZ.jpg 的文件,并且如果您希望它们不被覆盖,则必须验证该文件是否存在并更改其名称或单独保存文件的位置。

通常,有一个文件目录可以用来组织文件,比如user/userid/files/XYZ.jpg。

$_FILES['file']['tmp_name'] 是一个随机生成的临时名称。有可能,尽管不太可能,它最终可能会重演。

我建议,如果您不想采用文件夹分隔文件的方法,您可以使用:

while (file_exists($_FILES['file']['name'])) {
//If exists, then just add a random string to the end of the file
//This is just an example of an approach, what this will do is make your file look like: filename.jpg.aksjwq, 
//The rest is homework for you, to work an improved solution, I'm just here to give you the idea :P
    $_FILES['file']['name'] .= randomString(6);
}

function randomString($length = 6) {
    $str = "";
    $characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
    $max = count($characters) - 1;
    for ($i = 0; $i < $length; $i++) {
        $rand = mt_rand(0, $max);
        $str .= $characters[$rand];
    }
    return $str;
}