如果文件存在于PHP中,如何修改文件名?

时间:2013-12-22 00:49:26

标签: php html file file-upload replace

我有一个文件托管网站,一切都有效,除了一件事。我无法上传两个名称相同的文件。我希望能够使用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';
}

上述方法未发布错误消息。

2 个答案:

答案 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.extfile2.extfile4.ext的文件 您的用户上传了一个名为file.ext的文件,您将如何处理?你会迭代模式file*.ext,然后添加一个最大的数字?或寻找洞 并将其命名为file3.ext ?,或者您是否会在文件中附加一个随机数?你将如何处理碰撞?保持循环直到它工作?如果您处理大量上传,可能会让您的服务器真的很忙!

我要做的是,在文件系统上使用uniqid作为文件名,然后使用一个将原始文件名链接到UUID的数据库。

这样,你的所有用户都可以上传一个名为“file.ext”的文件,处理文件更加清晰,因为所有内容都是唯一的,并且它们的名称长度相同,无需担心文件名谁知道什么编码等。

它还会给你一个奖励,即能够更改UUID并向用户显示相同的文件名而不用担心他们看到的内容,这样你就可以在FS上的实际文件与用户之间建立一个层感知文件。