我正在用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'。这甚至是防止重复提交的好方法吗?
答案 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++;
}