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
,您的其他代码找不到它。
解决方案
您应该在两种情况下使用相同的文件名。因此,只需将 if
与 file_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);
在下面的代码中,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
,您的其他代码找不到它。
解决方案
您应该在两种情况下使用相同的文件名。因此,只需将 if
与 file_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);