dede如何实现tga图片上传后自动消失?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 DEDE建站 正文

TGA是一种不常用的图片格式,在网站中几乎不需要,因此这个需求很合理,最安全、最推荐的方法是修改DedeCMS的源代码,而不是使用有风险的第三方插件。

dede添加tga自动消失
(图片来源网络,侵删)

下面我将为您提供两种修改方法,强烈推荐第一种。


修改 include/helpers/upload.helper.php 文件(最推荐)

这是最标准、最安全的方法。upload.helper.php 是DedeCMS处理所有文件上传的核心文件,在这里修改可以确保无论是后台还是前台(如果有相关功能)的上传都会生效。

操作步骤:

  1. 备份文件 在进行任何修改之前,请务必备份您的网站文件,特别是 include/helpers/upload.helper.php,以防修改出错可以快速恢复。

  2. 找到核心代码 使用FTP或主机管理面板,找到并打开 include/helpers/upload.helper.php 文件,找到名为 UploadFile 的类,然后找到 GetFileType()Save() 这两个方法。

    dede添加tga自动消失
    (图片来源网络,侵删)
  3. 添加自定义删除代码 我们需要在文件成功保存之后,但函数返回结果之前,进行格式判断和删除操作。

    UploadFile 类的 Save() 方法中,找到类似这样的代码(不同版本DedeCMS可能略有差异,但逻辑一致):

    // ... 上传和保存文件的代码 ...
    // 移动文件到最终目录
    $this->moveFile($originFilename, $this->filePath);
    // ... 其他处理代码 ...
    // 返回成功信息
    return $this->GetFileType($this->filePath);

    return $this->GetFileType($this->filePath); 这一行之前,插入我们自定义的代码。

  4. 插入代码return 语句之前,添加以下PHP代码:

    dede添加tga自动消失
    (图片来源网络,侵删)
    // ==========================================================
    // 自定义代码:检查并删除 TGA 格式的文件
    // 作者:AI助手
    // 说明:如果上传的文件是 .tga 或 .TGA 格式,则立即删除。
    // ==========================================================
    $file_extension = strtolower($this->fileExt); // 获取文件后缀名并转为小写
    if ($file_extension == 'tga') {
        // 如果文件存在,则删除
        if (file_exists($this->filePath)) {
            @unlink($this->filePath);
            // (可选) 可以在这里记录日志,方便排查问题
            // $log_message = date('Y-m-d H:i:s') . " - 自动删除TGA文件: " . $this->filePath . "\n";
            // @file_put_contents(DEDEDATA.'/tga_delete_log.txt', $log_message, FILE_APPEND);
        }
        // 返回一个空字符串,表示文件无效,或者你也可以返回一个错误信息
        // return '';
    }
    // ==========================================================
  5. 保存文件 保存修改后的 upload.helper.php 文件。

效果说明:

当您在DedeCMS后台(或其他使用此上传逻辑的地方)上传任何 .tga.TGA 格式的文件时,系统会:

  1. 正常接收并临时保存文件。
  2. 将文件移动到指定目录。
  3. 在返回上传结果前,检测到文件后缀是 tga
  4. 立即调用 unlink() 函数将该文件从服务器上删除。
  5. 您会得到一个“上传成功”的提示,但实际上服务器上并没有这个文件,实现了“自动消失”的效果。

修改 dede/archives_add.php 文件(仅限文章上传)

如果您只想在发布文章时实现这个功能,并且不想修改核心上传类,可以只修改文章添加处理文件 dede/archives_add.php

操作步骤:

  1. 备份文件 备份 dede/archives_add.php

  2. 找到图片处理代码archives_add.php 文件中,找到处理文章内容(body)图片上传的代码段,通常在保存文章信息之前,会有一个循环处理 litpic(缩略图)和 body 中的图片的循环。

    寻找类似 UploadAll 函数调用的地方,或者处理 $body 变量的代码。

  3. 添加自定义删除代码 在图片上传成功后,对其进行遍历和判断,通常会有一个 foreach 循环。

    假设您找到了类似这样的代码(伪代码):

    // ... 处理文章内容中的图片 ...
    $body = HtmlReplace($body, -1, 0, 0, 0, 0, 0, $litpic); // 处理内容,提取图片
    // ... 其他处理 ...

    更精确的位置,是在 UploadAll 函数执行之后,或者 UploadFile 类实例化并调用 Save() 方法之后。

    在图片上传成功、路径被获取之后,添加判断逻辑,在处理缩略图的代码附近,或者在处理文章正文中每个图片的循环里:

    // 假设 $litpic 是缩略图的路径
    if (!empty($litpic)) {
        $tga_check = strtolower(substr(strrchr($litpic, "."), 1));
        if ($tga_check == 'tga') {
            @unlink($litpic);
            $litpic = ''; // 清空缩略图路径,防止存入数据库
        }
    }
    // 假设 $body_images 是一个包含所有文章图片路径的数组
    foreach ($body_images as $key => $img_path) {
        $tga_check = strtolower(substr(strrchr($img_path, "."), 1));
        if ($tga_check == 'tga') {
            @unlink($img_path);
            // 从文章内容中移除这个图片标签(这个比较复杂,需要正则替换)
            // $body = preg_replace('/<img\s+[^>]*src="'.$img_path.'"[^>]*>/i', '', $body);
            unset($body_images[$key]); // 从数组中移除
        }
    }

    这个方法相对复杂,需要针对您具体的代码位置进行调整,并且处理文章内容中的图片标签移除会更麻烦。

效果说明:

这种方法只对“发布文章”这个特定场景有效,如果您在“图集”或其他功能中也上传TGA文件,它将不会被删除。方法一是更通用、更彻底的解决方案


总结与建议

特性 方法一 (修改 upload.helper.php) 方法二 (修改 archives_add.php)
通用性 ,影响所有使用DedeCMS上传功能的地方 ,仅限修改的特定页面(如文章发布)
安全性 ,修改核心文件,逻辑清晰 中等,修改业务逻辑文件,可能与其他代码冲突
维护性 ,一次修改,全局生效 ,如果DedeCMS升级,可能需要重新修改
复杂度 ,只需在固定位置插入几行代码 ,需要定位具体业务逻辑,处理更复杂

强烈建议您使用方法一,它更符合软件工程的最佳实践,一劳永逸,且对系统稳定性影响最小。

最后再次提醒:操作前备份文件!

-- 展开阅读全文 --
头像
dede手机站列表页为何空白?
« 上一篇 今天
dede tag伪静态规则如何正确配置?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]