file_exists() 未按预期工作

file_exists() not working as expected

在下面的代码中,file_exists() 没有按预期工作。即使我试图上传相同的文件,else 部分也会被执行。 (即 file_exists() returns 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';
    }

问题

当您使用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.

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

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

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

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

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

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