我的网站上有很长时间的文件上传系统。在这段时间里,我意识到许多用户上传的文件包含相同的名称但彼此不同。由于名称相同,上传失败!
我决定不再使用$_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
用于另一个文件吗?
答案 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;
}