搜索
鲸奇世界,弘创无限
与我们取得联系
请拨打电话或者扫描下方微信二维码联系我们。
24小时电话
188-2547-1709
微信 王经理
建站、SEO业务
微信 王经理
小程序、系统定制业务

鲸奇世界,弘创无限

PbootCms 附件上传保留原文件名:V3.x 版本实操教程(含代码修改)

鲸弘科技
2026-01-08
0 次

image.png

核心需求复述

你希望在 PbootCms 系统中实现附件上传时保留文件的原始名称,替代系统默认的随机字符串重命名规则,这能让你更直观地管理和识别上传的附件,是 PbootCms 使用中典型的个性化定制需求。

解决方案(适配 PbootCms V3.x 主流版本)

前置准备

操作前务必备份目标文件(防止修改出错导致上传功能异常),确认你的 PbootCms 版本为 V3.x(不同版本文件路径略有差异,以下为通用方案)。

步骤 1:定位附件上传核心处理文件

PbootCms 的附件上传逻辑主要在core/function/extend.php文件中,找到名为upload_file的函数(附件上传核心函数);若你的版本中上传逻辑在admin/model/system/UploadModel.php,可参考相同逻辑修改。

步骤 2:修改文件名生成逻辑

系统默认会生成随机字符串作为新文件名,我们需要修改为 “原文件名 + 时间戳(避免同名覆盖)” 的格式,同时处理中文文件名乱码问题。

原始核心代码段(默认重命名部分):

// 生成随机文件名(默认逻辑)
$filename = random_string(16) . '.' . $ext;
$filepath = $upload_path . $filename;

修改后的代码段(保留原文件名):

// 保留原文件名核心逻辑
// 1. 获取原始文件名(去除路径,仅保留文件名)
$original_name = basename($_FILES[$name]['name']);
// 2. 分离原文件名和后缀
$original_name_arr = explode('.', $original_name);
$ext = array_pop($original_name_arr); // 后缀
$original_name = implode('.', $original_name_arr); // 纯原文件名
// 3. 过滤特殊字符+处理中文乱码(防止安全问题和乱码)
$original_name = iconv('UTF-8', 'GBK//IGNORE', $original_name); // 解决中文乱码
$original_name = preg_replace('/[^w-.]/', '', $original_name); // 过滤特殊字符
// 4. 拼接“原文件名+时间戳+后缀”(避免同名文件覆盖)
$filename = $original_name . '_' . time() . '.' . $ext;
$filepath = $upload_path . $filename;

步骤 3:完整上传函数示例(关键部分标注)

/**
 * 文件上传函数(修改后保留原文件名版)
 * @param string $name 表单名称
 * @param string $upload_path 上传路径
 * @return array
 */
function upload_file($name = 'file', $upload_path = './upload/file/') {
    // 基础配置(省略系统原有校验代码,仅展示文件名核心修改)
    $upload_path = rtrim($upload_path, '/') . '/';
    ! is_dir($upload_path) && mkdir($upload_path, 0755, true);
    
    // 获取文件信息
    $file = $_FILES[$name];
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    
    // ========== 核心修改:保留原文件名 ==========
    // 1. 获取原始文件名并处理
    $original_name = basename($file['name']);
    $original_name_arr = explode('.', $original_name);
    $ext = array_pop($original_name_arr);
    $original_name = implode('.', $original_name_arr);
    // 2. 过滤特殊字符+中文转码(避免乱码/安全问题)
    $original_name = iconv('UTF-8', 'GBK//IGNORE', $original_name);
    $original_name = preg_replace('/[^w-.]/', '', $original_name);
    // 3. 生成最终文件名(原文件名+时间戳,防止同名覆盖)
    $filename = $original_name . '_' . time() . '.' . $ext;
    $filepath = $upload_path . $filename;
    // ==========================================
    
    // 执行上传(系统原有逻辑,无需修改)
    if (move_uploaded_file($file['tmp_name'], $filepath)) {
        return [
            'code' => 1,
            'msg' => '上传成功',
            'file' => str_replace('./', '/', $filepath),
            'name' => $filename, // 前端显示保留原文件名(可直接用$original_name)
            'size' => $file['size']
        ];
    } else {
        return ['code' => 0, 'msg' => '上传失败'];
    }
}

步骤 4:测试验证

  1. 登录 PbootCms 后台,进入 “系统管理 - 附件管理”;

  2. 上传一个带中文 / 特殊命名的文件(如 “产品说明书 V2.0.pdf”);

  3. 查看上传后的文件名称,应为 “产品说明书 V2.0_1735689000.pdf”(时间戳为上传时的秒数),确认文件名保留原始名称且无乱码。

关键注意事项

  1. 同名文件处理:必须添加time()时间戳,否则新上传的同名文件会覆盖旧文件;

  2. 中文乱码:iconv转码是关键,若服务器编码为 UTF-8,可调整为iconv('GBK', 'UTF-8//IGNORE', $original_name);

  3. 安全过滤:preg_replace过滤特殊字符(如/ : * ? " < > |),防止恶意文件名导致的安全问题;

  4. 版本适配:若你的 PbootCms 为 V2.x,上传函数路径可能为core/common/function.php,逻辑完全通用。

总结

  1. 核心是修改upload_file函数中文件名生成逻辑,替代系统默认的随机命名;

  2. 必须兼顾 “原文件名保留”“中文乱码处理”“同名文件覆盖” 三个核心问题;

  3. 操作前备份文件,修改后通过后台上传附件验证功能是否正常。

AI 智能助理
您好!有什么可以帮助您的吗?
  • 稳定
    多年经验,服务稳定
  • 贴心
    全国7*24小时客服热线
  • 专业
    产品经理在线技术支持
  • 快速
    快速评估,快速执行
  • 承诺
    有目共睹,我们选声誉
复制成功

微信号:kaxiO_o

添加微信好友,免费获取方案及报价

我知道了
联系
扫码添加技术微信
1V1在线技术支持
联系电话
188-2547-1709建站、seo业务
电话若占线或未接到、就加下微信
联系邮箱
frank@vi23.com企业邮箱