我有一个文件托管网站,一切都有效,除了一件事。我无法上传两个名称相同的文件。我希望能够使用file_2.ext
这样的格式来覆盖新文件的名称。我相信这可以通过file_exists()
函数完成,但我无法使其工作。我将发布我用来获取文件的系统。
系统:
if (move_uploaded_file($tmp_location, $location . $name)) {
echo'<br>Upload was successful';
}
我尝试过:
if (isset($_POST['submit_file']) &&!file_exists($name)) {
move_uploaded_file($tmp_location, $location . $name)
echo'<br>Upload was successful';
} else if (isset($_POST['submit_file']) &&file_exists($name)) {
!move_uploaded_file($tmp_location, $location . $name);
echo 'File exists';
}
上述方法未发布错误消息。
答案 0 :(得分:0)
尝试这样的事情。您需要找到一个唯一的文件名。你不想无限期地让它去,所以添加一个限制。
function get_unique_filename($filename) {
if (!file_exists($filename)) return $filename;
$limit = 200;
$path = dirname($filename).DIRECTORY_SEPARATOR;
$basename = basename($filename);
$parts = explode('.', $basename);
$ext = array_pop($parts);
$base = implode('.', $parts);
for ($i=2; $i<$limit+2; $i++)
if (!file_exists($path.$base.'_'.$i.'.'.$ext))
return $path.$base.'_'.$i.'.'.$ext;
return false;
}
if (isset($_POST['submit_file'])) {
$new_path = get_unique_filename($location.$name);
if ($new_path && !move_uploaded_file($tmp_location, $new_path))
echo 'Could not upload file.'
else
echo '<br/>Upload was successful';
}
答案 1 :(得分:0)
你认为处理它的方式是错误的,即使你需要用户拥有“原始”文件名,如果他们上传了“file.ext”,你就无法显示“file2.ext”,这只是令人困惑,感觉如此错误,举个例子
您的服务器包含名为file.ext
,file2.ext
和file4.ext
的文件
您的用户上传了一个名为file.ext
的文件,您将如何处理?你会迭代模式file*.ext
,然后添加一个最大的数字?或寻找洞
并将其命名为file3.ext
?,或者您是否会在文件中附加一个随机数?你将如何处理碰撞?保持循环直到它工作?如果您处理大量上传,可能会让您的服务器真的很忙!
我要做的是,在文件系统上使用uniqid作为文件名,然后使用一个将原始文件名链接到UUID的数据库。
这样,你的所有用户都可以上传一个名为“file.ext”的文件,处理文件更加清晰,因为所有内容都是唯一的,并且它们的名称长度相同,无需担心文件名谁知道什么编码等。
它还会给你一个奖励,即能够更改UUID并向用户显示相同的文件名而不用担心他们看到的内容,这样你就可以在FS上的实际文件与用户之间建立一个层感知文件。