【问题标题】:file_exists() not working as expectedfile_exists() 没有按预期工作
【发布时间】:2026-01-14 17:10:01
【问题描述】:

在下面的代码中,file_exists() 没有按预期工作。即使我尝试上传相同的文件,else 部分也会被执行。 (即file_exists() 在每种情况下都返回false。)这种行为背后的原因是什么?

if (isset($_FILES['file']['name']) && isset($_FILES['file']['size']) && isset($_FILES['file']['type']) && isset($_FILES['file']['tmp_name']))
{
    if (!empty($_FILES['file']['name']) && strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION))=='jpg' || strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION))=='jpeg')
    {
        if(file_exists($_FILES['file']['name']))
        {
           echo 'file exists';
        }
        else
        {
           move_uploaded_file($_FILES['file']['tmp_name'], 'Images/'.$_FILES['file']['name']);

           echo $_FILES['file']['name'].' Uploaded'.'<br>';
        }
     }
}
else{ 
     echo 'select your file';
    }

【问题讨论】:

  • 'Images/'.$_FILES['file']['name'] - 这是您将文件移动到的位置,但您只测试$_FILES['file']['name'](请记住,信息由客户端提供,它几乎可以是any 字符串)
  • @VolkerK 谢谢!现在工作得很好。

标签: php file-exists


【解决方案1】:

问题

当您使用file_exists 时,您只使用文件的短名称。

if(file_exists($_FILES['file']['name']))

例如,如果您上传一个名为 test.jpg 的文件,它会检查 ./test.jpg 是否存在。

但是,当你真正移动上传的文件时,你把它放在一个名为Images的目录中:

move_uploaded_file($_FILES['file']['tmp_name'], 'Images/'.$_FILES['file']['name']);

现在,如果您上传该 test.jpg,它会移动到您的其他代码找不到的 ./Images/test.jpg

解决办法

您应该在这两种情况下使用相同的文件名。因此,只需将 iffile_exists 调用更改为:

if(file_exists('Images/'.$_FILES['file']['name']))

此代码将文件夹名称添加到文件名中,以便您检查路径是否正确;上传test.jpg 会导致检查文件./Images/test.jpg

【讨论】:

    【解决方案2】:

    $_FILES['file']['name'] 是您的 INPUT / POST 数据,而不是您的真实文件;

    你应该检查$your_dir_path_to_file . '/'.$_FILES['file']['name']

    【讨论】:

      【解决方案3】:

      设置默认文件系统分隔符(取决于系统):

      defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);
      

      如果可以,请尝试使用绝对路径而不是相对路径,并使用“../../file.jpg”之类的名称保护系统:

      defined('BASE_PATH') ? null :  define('BASE_PATH', 'C:'.DS.'www'.DS.'Images'.DS);
      

      【讨论】: