代码之家  ›  专栏  ›  技术社区  ›  S.G.

PHP会再次使用一个使用过的tmp_名称吗?

  •  0
  • S.G.  · 技术社区  · 6 年前

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

    在我看来 echo 一个 $_FILES['file']['tmp_name'] 看起来像 /tmp/phpynIF3G . 我要用 $_文件[“文件”][“tmp_名称”] 文件名。

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

    如果Php已经使用 /tmp/phpynIF3G公司 一次,它会不会用同样的 tmp_name 再来一份文件?

    2 回复  |  直到 6 年前
        1
  •  1
  •   abr    6 年前

    如果每个用户上载一个名为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;
    }
    
        2
  •  1
  •   Lawrence Cherone    6 年前

    是的,有可能, tmp != unique

    避免使用 tmp_name 作为它的名称,使用它的实名或散列文件来获取它的校验和(>sha256),然后使用它,如果您希望它简短,只需将它存储为一个自动递增的数字,然后使用 base_convert() ,或类似于lib的 hashids .