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