PHP会再次使用旧的tmp_name吗?

时间:2018-07-25 10:10:01

标签: php filenames

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

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

例如,起初是$filename = $_FILES['file']['name'];,现在是$filename = str_replace("/tmp/php","",$_FILES['file']['tmp_name']).".jpg";。 因此,当文件成功上传到我的/e/目录时,可以通过https://sitename/e/ynIF3G.jpg的URL进行访问。

如果Php已经使用过一次/tmp/phpynIF3G,它将再次使用相同的tmp_name用于另一个文件吗?

2 个答案:

答案 0 :(得分:1)

是的,有一种可能,tmp!= unique

避免使用tmp_name作为其名称,请使用其真实名称或对文件进行哈希处理以获取其校验和(> sha256),然后使用该名称,如果您希望将其简短存储,则将其存储为自动递增的数字,然后使用base_convert()hashids之类的库。

答案 1 :(得分:1)

如果每个用户都上传一个名为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;
}