You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何为上传文件添加随机名称避免同名文件被覆盖

WordPress文件上传重名覆盖问题修复方案

核心实现逻辑

将原文件名拆分为名称主体、扩展名两个部分,在两者中间插入时间戳/唯一随机串,拼接为不会重复的新文件名,同时保证数据库存储的文件名和实际落地存储的文件名一致。

修改后的完整代码

if(isset($_FILES['attachment'])){
    $errors= array();
    $file_name = $_FILES['attachment']['name'];
    $file_size =$_FILES['attachment']['size'];
    $file_tmp =$_FILES['attachment']['tmp_name'];
    $file_type=$_FILES['attachment']['type'];
    $file_ext=strtolower(end(explode('.',$_FILES['attachment']['name'])));
    
    $extensions= array("jpeg","jpg","png");
    
    if(in_array($file_ext,$extensions)=== false){
        $errors[]="extension not allowed, please choose a JPEG or PNG file.";
    }
    
    if($file_size > 2097152){
        $errors[]='File size must be excately 2 MB';
    }

    // ========== 新增重名处理逻辑 开始 ==========
    // 提取原文件名主体(不含后缀)
    $file_name_body = pathinfo($file_name, PATHINFO_FILENAME);
    // 拼接新文件名:原名称_时间戳_唯一随机串.后缀
    // 可根据需求替换为 rand(1000,9999) 等随机数方案
    $new_file_name = $file_name_body . '_' . time() . '_' . uniqid() . '.' . $file_ext;
    // ========== 新增重名处理逻辑 结束 ==========
}

// 此处把原来插入SQL的$file_name替换为新生成的$new_file_name
$sql = $wpdb->prepare( "INSERT INTO ".$tablename." (post_id, name, email, price, author, post_title, purchase_type, closing_date, concessions_amount, insp_from, insp_to, seller_charge, emd, home_warranty, seller_occupancy, attachment ) VALUES ( %d, %s, %s, %d, %s, %s, %s, %s, %d, %s, %s, %d, %d, %s, %s, %s )", $id, $name, $email, $price, $author, $post_title, $purchase_type, $closing_date, $concessions_amount, $insp_from, $insp_to, $seller_charge, $emd, $home_warranty, $seller_occupancy, $new_file_name );

if(empty($errors)==true){
    function tp_wordpress_uploads_directory_path() {
        $upload_dir = wp_upload_dir();
        return $upload_dir['basedir'] . "/offers/";
    }
    // 此处也替换为$new_file_name,保证存储的文件名和数据库记录一致
    $upload_check =  move_uploaded_file($file_tmp,tp_wordpress_uploads_directory_path().$new_file_name);
}

可选调整方案

  • 若需要用可读的日期标识代替时间戳,可把time()替换为date('YmdHis'),生成类似photo_20240520143022_664b2f4e7c1a2.jpg格式的文件名
  • 若要使用你熟悉的rand()随机数方案,可把拼接逻辑改为:
$new_file_name = $file_name_body . '_' . rand(1000, 9999) . '.' . $file_ext;

可自行调整随机数的范围降低冲突概率。

注意事项

请提前确认wp-content/uploads/offers目录存在且具备读写权限,否则会出现移动文件失败的问题。

内容的提问来源于stack exchange,提问作者qazidev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:45:03