这是一个非常常见的需求,通常有两种实现方式:

- 推荐方式:修改 UEditor 的上传代码,这种方式最直接,所有通过 UEditor 上传的图片都会自动带上水印,一劳永逸。
- 备选方式:修改 DedeCMS 的核心上传类,这种方式会影响整个系统的图片上传,包括后台其他地方的上传功能。
下面我将重点讲解第一种推荐方式,并简要说明第二种方式。
修改 UEditor 的上传代码(推荐)
这种方式的核心是找到 UEditor 处理图片上传的 PHP 文件,并在图片保存后、返回 URL 前,调用 DedeCMS 自带的水印函数。
步骤 1:定位 UEditor 的后端文件
UEditor 是一个独立的组件,DedeCMS 只是将其集成进来,你需要找到 UEditor 的服务器端处理文件。
它的路径是:
/include/ueditor/php/uploader.class.php

这是 UEditor 的核心上传类文件。
步骤 2:找到图片处理并保存的位置
打开 uploader.class.php 文件,找到 save 方法,这个方法负责将上传的文件从临时目录移动到最终的保存目录。
在 save 方法的末尾,在 return $this->stateInfo 这行代码之前,就是添加水印的最佳位置。
步骤 3:添加水印代码
在 save 方法末尾,return 之前,插入以下代码:
// ... save 方法中的其他代码 ...
// 在 return $this->stateInfo; 之前添加
// ==============================================
// 开始添加 DedeCMS 水印
// ==============================================
if ($this->oriName !== 'nologo.png') { // 排掉 UEditor 自带的小图标
$fileUrl = $this->filePath; // 获取刚刚保存的图片完整路径
$fullpath = $_SERVER['DOCUMENT_ROOT'] . $fileUrl; // 获取服务器绝对路径
// 检查文件是否存在,并且是图片
if (file_exists($fullpath) && preg_match("/\.(jpg|jpeg|png|gif)$/i", $fullpath)) {
// 引入 DedeCMS 的水印配置和函数文件
// 注意:dede 系统常量未定义,可能需要手动定义 $cfg_basedir
if (!defined('DEDEROOT')) {
define('DEDEROOT', dirname(__FILE__) . '/../../'); // 根据你的实际结构调整
}
require_once DDEROOT . '/config.php';
require_once DDEROOT . '/include/ueditor/php/image.class.php'; // UEditor 自带的图片处理类,可选
require_once DDEROOT . '/include/helpers/image.helper.php'; // DedeCMS 的图片处理帮助类,强烈推荐
// 调用 DedeCMS 的加水印函数
// 这个函数会自动读取后台设置:系统 -> 系统基本参数 -> 图片设置
// 包括水印位置、类型(文字/图片)、透明度等
WaterImg($fullpath, $fullpath);
}
}
// ==============================================
// 添加水印结束
// ==============================================
return $this->stateInfo;
代码解释:
if ($this->oriName !== 'nologo.png'):这是一个小技巧,避免给 UEditor 工具栏上的小图标也添加水印。$fileUrl和$fullpath:获取图片的相对路径和服务器绝对路径,DedeCMS 的水印函数通常需要绝对路径。require_once ...:引入 DedeCMS 的核心配置文件和图片处理帮助类。image.helper.php是 DedeCMS 专门封装好的图片处理类,里面包含了WaterImg函数。WaterImg($fullpath, $fullpath):这是关键!调用 DedeCMS 的水印函数。- 第一个参数
$fullpath:源图片路径。 - 第二个参数
$fullpath:目标图片路径,我们直接覆盖原图,也可以另存为新图($newpath = 'path/to/watermarked_image.jpg')。 - 重要:这个函数的行为由 DedeCMS 后台的
系统 -> 系统基本参数 -> 图片设置中的选项控制,你需要在后台正确配置水印的样式(文字/图片)、位置、透明度等。
- 第一个参数
步骤 4:配置 DedeCMS 后台水印
- 登录你的 DedeCMS 后台。
- 进入 “系统” -> “系统基本参数” -> “图片设置”。
- 找到以下选项并进行配置:
WaterMarkEnable:设置为是,开启水印功能。WaterMarkType:选择图片或文字。- 图片水印:需要上传一张水印图片(通常是透明背景的 PNG),并设置
WaterMarkImg为该图片的路径(相对于网站根目录,如/images/water.png)。 - 文字水印:设置
WaterMarkText为你想要的水印文字(如“版权所有”)。
- 图片水印:需要上传一张水印图片(通常是透明背景的 PNG),并设置
WaterMarkPos:选择水印位置,如9(右下角)。WaterMarkTransparent:设置透明度,建议50-80之间。WaterMarkXTSpace/WaterMarkYTSpace:设置水印距离图片边缘的间距。
配置完成后,保存即可。
步骤 5:测试
通过 UEditor 上传一张图片,然后去网站对应的图片目录下查看,图片应该已经自动添加了你在后台配置的水印。
修改 DedeCMS 的核心上传类(备选)
如果你希望所有上传到网站(包括会员上传、后台其他功能上传)的图片都带水印,可以修改 DedeCMS 的核心上传类。
这个类通常位于:/include/helpers/upload.helper.php
你需要找到 Upload 类中的 SaveFile 方法,并在文件保存成功后、返回文件名前,调用 WaterImg 函数。
缺点:
- 影响范围太广,可能会影响到你不希望加水印的地方。
- DedeCMS 升级,这个修改可能会被覆盖。
除非有特殊需求,否则强烈推荐使用第一种方式。
常见问题与注意事项
-
水印不显示?
- 路径问题:确保
$fullpath是服务器的绝对路径,并且路径正确无误。echo $fullpath; die;可以用来调试路径。 - 权限问题:确保网站用户(如
www-data,IIS_IUSRS)对图片目录有写入权限。 - GD库问题:确保你的 PHP 环境安装并开启了 GD 库。
phpinfo()中可以查看。 - 配置问题:再次检查 DedeCMS 后台的水印配置是否都已正确开启和填写。
- 路径问题:确保
-
水印位置不对?
- 检查 DedeCMS 后台“图片设置”中的
WaterMarkPos值,1-9 分别代表不同位置,可以多试几次。
- 检查 DedeCMS 后台“图片设置”中的
-
水印透明度不生效?
确保图片是 24位 或 32位的真彩色图片,如果是 GIF 或 256色的 PNG,透明度可能无法正常显示。
-
水印图片路径错误?
- 如果使用图片水印,
WaterMarkImg的路径是相对于网站根目录的,而不是相对于/uploads/目录,如果你的水印图片在/images/water.png,那么这里就填写/images/water.png。
- 如果使用图片水印,
对于 DedeCMS + UEditor 的图片水印问题,最佳实践是修改 include/ueditor/php/uploader.class.php 文件,这样做既精准又不会影响系统的其他部分,并且可以充分利用 DedeCMS 后台强大的水印配置功能。
