dede如何实现上传文件自动压缩?

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

下面我将为您提供详细的步骤和代码,主要针对图片自动压缩,这是最常见的需求。

dede上传文件时自动压缩
(图片来源网络,侵删)

核心原理

DedeCMS 的文件上传逻辑封装在 upload.helper.php 文件中,当用户上传文件时,系统会调用这个文件中的函数来处理文件,我们只需要修改这个文件,在图片上传成功后、保存到服务器之前,调用 PHP 的图像处理函数(如 GD 库)进行压缩,然后保存压缩后的新文件即可。


详细操作步骤

第一步:备份原文件

在进行任何修改之前,请务必备份您的网站文件,特别是 include/helpers/upload.helper.php,这是防止操作失误导致网站无法上传文件的重要保障。

第二步:修改 include/helpers/upload.helper.php 文件

用 FTP 或其他文件管理工具连接到您的服务器,找到并打开 include/helpers/upload.helper.php 文件。

找到 UploadFile 类中的 Save() 方法,这个方法是处理文件上传并保存的核心方法,我们需要在这个方法里添加压缩图片的逻辑。

dede上传文件时自动压缩
(图片来源网络,侵删)

关键代码位置:

Save() 方法中,找到类似这样的代码段(通常在文件移动或复制到目标目录之后):

// ... 其他代码 ...
// 保存文件
//移动文件
if (!move_uploaded_file($this->upfile, $this->filepath))
{
    $this->SetError("上传文件到". $this->filepath."失败。");
    return false;
}
// ... 其他代码 ...

你需要在这个 move_uploaded_file 函数执行成功之后,添加图片压缩的代码。

第三步:添加图片压缩代码

将下面的代码块复制并粘贴到 move_uploaded_file 函数成功执行之后的位置。

dede上传文件时自动压缩
(图片来源网络,侵删)
// 图片自动压缩功能
if ($this->filetype == 'image' && in_array($this->fileext, array('jpg', 'jpeg', 'png', 'gif')))
{
    // 创建一个新的图像处理对象
    $image = new ImageResize($this->filepath);
    // 设置最大宽度和高度,可以根据需要修改
    $image->resizeToWidth(1920); // 如果宽度超过1920px,则按比例缩小
    // 或者使用 $image->resizeToHeight(1080); // 如果高度超过1080px,则按比例缩小
    // 或者使用 $image->resizeToBestFit(1920, 1080); // 缩放到最适合的尺寸,不超过宽高
    // 设置图片质量 (1-100, 值越高质量越好文件越大)
    $image->quality_jpg = 85; // 对JPG图片设置85%的质量
    $image->quality_png = 9; // 对PNG图片设置压缩级别 (1-9, 9是最高压缩)
    // 覆盖保存压缩后的图片
    $image->save($this->filepath);
}

注意: 上面的代码使用了 ImageResize 这个类,它是一个轻量级的 PHP 图像处理库,比原生的 GD 库更简单易用,如果你的网站没有这个类,你需要先下载它。

如何获取 ImageResize 类?

  1. 从 GitHub 下载:https://github.com/krzysztofrewak/php-image-resize
  2. 下载后,将 ImageResize.php 这个文件上传到你的 DedeCMS 网站的 include/ 目录下。
  3. 确保 include/ 目录有写入权限,因为在上传过程中,系统可能需要生成一些临时文件。

如果你不想使用第三方库,也可以使用 PHP 原生的 GD 库来实现,代码会稍微复杂一些。


使用原生 GD 库的压缩方案(备选)

如果你不想引入外部库,可以使用下面的代码替换上面的 ImageResize 代码块,这段代码直接使用 GD 函数。

// 图片自动压缩功能 (使用原生GD库)
if ($this->filetype == 'image' && in_array($this->fileext, array('jpg', 'jpeg', 'png')))
{
    // 获取图片信息
    $imageInfo = getimagesize($this->filepath);
    $width = $imageInfo[0];
    $height = $imageInfo[1];
    $mime = $imageInfo['mime'];
    // 如果图片尺寸过大,则进行压缩
    // 你可以设置一个最大尺寸阈值
    $maxWidth = 1920;
    $maxHeight = 1080;
    $quality = 85; // 图片质量 1-100
    if ($width > $maxWidth || $height > $maxHeight) {
        // 计算缩放比例
        $ratio = min($maxWidth / $width, $maxHeight / $height);
        $newWidth = (int)($width * $ratio);
        $newHeight = (int)($height * $ratio);
        // 创建画布
        $newImage = imagecreatetruecolor($newWidth, $newHeight);
        // 根据MIME类型创建原图资源
        switch ($mime) {
            case 'image/jpeg':
                $source = imagecreatefromjpeg($this->filepath);
                // 保存压缩后的图片
                imagejpeg($newImage, $this->filepath, $quality);
                break;
            case 'image/png':
                $source = imagecreatefrompng($this->filepath);
                // PNG质量是 0-9, 9是最大压缩
                imagepng($newImage, $this->filepath, 9 - round($quality / 100 * 9));
                break;
            default:
                // 如果不是jpg或png,则不处理
                imagedestroy($newImage);
                continue 2; // 跳出本次循环
        }
        // 调整大小
        imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
        // 释放内存
        imagedestroy($source);
        imagedestroy($newImage);
    }
}

完整代码示例(推荐使用 ImageResize)

ImageResize.php 放到 include/ 目录后,你的 upload.helper.php 修改部分看起来像这样:

// 在 include/helpers/upload.helper.php 文件中
// ... 在文件顶部,class UploadFile 之前,引入 ImageResize 类 ...
require_once DEDEINC.'/ImageResize.php';
// ... 找到 UploadFile 类的 Save() 方法 ...
public function Save()
{
    // ... 原有代码 ...
    //移动文件
    if (!move_uploaded_file($this->upfile, $this->filepath))
    {
        $this->SetError("上传文件到". $this->filepath."失败。");
        return false;
    }
    // ============ 【开始添加】图片自动压缩功能 ============
    if ($this->filetype == 'image' && in_array($this->fileext, array('jpg', 'jpeg', 'png', 'gif')))
    {
        try {
            $image = new ImageResize($this->filepath);
            // 设置最大宽度,保持宽高比
            $image->resizeToWidth(1920);
            // 设置图片质量
            $image->quality_jpg = 85;
            $image->quality_png = 9;
            // 覆盖保存压缩后的图片
            $image->save($this->filepath);
        } catch (Exception $e) {
            // 如果压缩失败,记录错误但不中断上传
            // 你可以在日志中记录 $e->getMessage()
        }
    }
    // ============ 【结束添加】图片自动压缩功能 ============
    // ... 原有代码 ...
    // ... 返回 true ...
}

注意事项

  1. GD 库支持:使用原生 GD 库方案时,请确保你的 PHP 环境已经安装并启用了 GD 库,你可以通过 phpinfo() 函数来检查。
  2. 权限问题:确保网站目录(特别是 uploads/ 目录)有正确的写入权限,否则图片无法被保存或覆盖。
  3. 性能影响:图片压缩会占用服务器 CPU 资源,如果你的网站流量巨大,上传非常频繁,可能会对服务器性能造成一定影响,但对于大多数中小型网站来说,这点影响可以忽略不计。
  4. 测试:修改完成后,请务必在后台进行多次图片上传测试,检查上传的图片是否被成功压缩,并且网站其他功能是否正常。
  5. 非图片文件:此方案仅对图片文件有效,如果你需要压缩其他类型的文件(如 PDF),则需要使用专门的库(如 Smalot/PdfParser)来实现,逻辑会更复杂。

通过以上步骤,你就可以成功地为 DedeCMS 添加上传文件时自动压缩的功能了,推荐使用 ImageResize 方案,因为它更简洁、易读且功能强大。

-- 展开阅读全文 --
头像
dede列表页如何调用文章内容?
« 上一篇 昨天
dede没找到数据结构文件
下一篇 » 昨天

相关文章

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

目录[+]