You need to enable JavaScript to run this app. 如何使用PHP file_exists检测上传重复文件并提示文件已存在错误
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 22:36:03