使用file_exists()检查类似的文件名以防止覆盖/重复?

时间:2014-09-10 02:23:10

标签: php

我正在用PHP编写一个应用程序,用户提交一种数据形式,并根据数据选择文件名,如下所示:

$filename = "./savelocation/".$name."_".$identification."_".$date.'.txt';

我正在尝试使用file_exists()函数来检查是否存在具有相同名称的文件。如果是,则更改最终名称以防止覆盖提交的表单数据。这是我的实施:

$file = "./savelocation/".$name."_".$identification."_".$date.'.txt';
$file = preg_replace('/\s+/', '', $file); 
$filepath = "./savelocation/".$name."_".$identification."_".$date.'.txt';

if(file_exists($filepath))
{
    $file = "./savelocation/"."INVALIDFILE".'.txt';
} 

这可以防止人们通过将名称更改为单个文件来覆盖应用程序,该文件充当“默认文件”,如果被覆盖则无关紧要。但是,我知道这是错的。我的逻辑是if语句将返回true,这将执行语句内部的代码,将文件名更改为'default file'。这甚至是防止重复提交的好方法吗?

2 个答案:

答案 0 :(得分:0)

试试这个...如果文件名匹配,则从循环中断并重定向

$userFile = $name."_".$identification."_".$date.'.txt;
$fileArray = glob('./savelocation/*');
$arrCount = count($fileArray);
$i = 1;
$msg = null;

foreach ($fileArray as $FA) {
    $fileSubstring = str_replace("\.\/savelocation\/", "", $FA);
    if ($i > $arrCount) {
        break;
    } else if ($userFile === $fileSubstring) {
        $msg = 'repeat';
        break;
    } else null;
    $i++;
}

if (isset($msg)) header('location: PageThatChastisesUser.php');

或者,如果您稍微调整代码以更改文件名,则应该可以使用:

if(file_exists($file)) {
    $file = str_replace("\.txt", "duplicate\.txt", $file); 
}

以一种将您自己标识为重复的方式更改文件名。

答案 1 :(得分:0)

这是一种方法:

$file = "./savelocation/".$name."_".$identification."_".$date.'.txt';
$file = preg_replace('/\s+/', '', $filen); 
$filepath = "./savelocation/".$name."_".$identification."_".$date.'.txt';

$i = 1;
while(file_exists($filepath))
{
   $filepath = "./savelocation/".$name."_".$identification."_".$date.'_'.$i.'.txt';
   $i++;
}