如何使用PHP file_exists检测上传重复文件并提示文件已存在错误
问题排查
你遇到的无法触发文件已存在提示的问题,核心有两个错误点:
- 判断逻辑错误:你使用
&&(逻辑与)连接了$fileError > 0和file_exists($fileDestination)两个条件,这意味着只有「上传本身出现错误」且「目标文件已存在」两个情况同时发生时,才会输出文件已存在的提示。正常上传无错误的场景下$fileError值为0,所以哪怕目标文件真实存在,这个判断条件也不会触发,直接走了上传成功的分支。 - 目标文件名构造错误:你当前的代码是直接在原文件名后拼接小写后缀,假设原文件名为
test.jpg,处理后得到的$fileNewName会变成test.jpg.jpg,你判断存在的路径和实际预期存储的路径不一致,也会导致文件存在判断失效。
修正后的代码
<?php if(isset($_POST['show'])){ $fileName = $_FILES['file']['name']; $fileTempName = $_FILES['file']['tmp_name']; $fileSize = $_FILES['file']['size']; $fileError = $_FILES['file']['error']; $fileAllowed = array('jpg', 'jpeg', 'png', 'txt', 'mp3', 'mp4', 'js', 'pdf', 'svg'); $ext = explode('.', $fileName); $newExt = end($ext); $lowerCaseExt = strtolower($newExt); // 修正文件名构造逻辑,只保留文件名主体加小写后缀 $fileNameWithoutExt = substr($fileName, 0, strrpos($fileName, '.')); $fileNewName = $fileNameWithoutExt . '.' . $lowerCaseExt; $fileDestination = 'uploads/' . $fileNewName; if(!in_array($lowerCaseExt, $fileAllowed)){ echo '<br>文件类型不允许上传'; exit(); } if($fileSize > 1000000){ echo '<br>文件大小超出限制'; exit(); } // 修正判断逻辑,先判断上传本身有无错误,再单独判断文件是否存在 if($fileError > 0){ echo '<br>上传出错,错误码:'.$fileError; exit(); } if(file_exists($fileDestination)){ echo "<br>文件已存在"; exit(); } move_uploaded_file($fileTempName, $fileDestination); echo "<br>文件上传成功"; exit(); }
补充说明
如果不需要强制将后缀转为小写,可以直接使用原文件名构造存储路径,简化逻辑:
// 直接替换$fileNewName构造逻辑即可 $fileNewName = $fileName;
内容的提问来源于stack exchange,提问作者falcon
相关产品推荐
相关产品推荐

