下面我将为你提供一个详细的、基于修改核心文件的方案,这个方案稳定且高效,整个过程主要分为两大步:

(图片来源网络,侵删)
- 配置 OSS 参数:在 DedeCMS 后台添加 OSS 的配置信息。
- 修改核心代码:让 DedeCMS 在上传图片时自动调用 OSS SDK 进行上传。
准备工作
- 阿里云 OSS 账号:确保你已经有一个开通了 OSS 服务的阿里云账号。
- AccessKey:拥有
AliyunOSSFullAccess(或至少oss:PutObject、oss:ListBucket等权限)的AccessKey ID和AccessKey Secret。 - Bucket 信息:你的
Bucket 名称、Endpoint(地域节点地址,如oss-cn-hangzhou.aliyuncs.com)。 - PHP 环境:你的服务器必须安装了 cURL 扩展,因为 OSS SDK 依赖它。
- 下载 OSS PHP SDK:
- 访问阿里云官方 GitHub 仓库:https://github.com/aliyun/aliyun-oss-php-sdk
- 下载
master分支的代码,并解压。 - 我们只需要
aliyun-oss-php-sdk文件夹内的内容,将其重命名为oss,然后上传到你的 DedeCMS 根目录下的/include/文件夹里。 - 你的目录结构应该是:
/include/oss/。
第一步:在 DedeCMS 后台配置 OSS 参数
我们需要在 DedeCMS 的系统设置中添加 OSS 的配置项,方便以后修改。
- 打开数据库管理工具(如 phpMyAdmin)。
- 找到你的 DedeCMS 数据库,找到
#@__sysconfig这张表。 - 点击“插入”新行,或者找到一条
varname为cfg_ftp_host的记录进行修改(推荐新增,避免冲突)。 - 添加以下几行配置:
| varname (字段名) | info (字段描述) | value (字段值) | type (字段类型) |
|---|---|---|---|
| cfg_oss_open | 是否开启OSS | Y | bool |
| cfg_oss_endpoint | OSS访问域名 | oss-cn-hangzhou.aliyuncs.com (替换成你的) |
text |
| cfg_oss_bucket | OSS Bucket名称 | my-test-bucket (替换成你的) |
text |
| cfg_oss_accessid | OSS AccessKey ID | LTAI4G... (替换成你的) |
text |
| cfg_oss_accesskey | OSS AccessKey Secret | 5K8v4I... (替换成你的) |
text |
| cfg_oss_dir | OSS上传目录 | dede/ |
text |
说明:
cfg_oss_open: 设置为Y表示开启自动上传功能,设置为N则关闭。cfg_oss_dir: 这是你在 OSS Bucket 中创建的用来存放 Dedecms 图片的目录,建议以 开头和结尾,如/dede/。
第二步:修改 DedeCMS 核心代码
这是最关键的一步,我们需要修改 DedeCMS 处理图片上传的核心文件。
修改 /include/helpers/upload.helper.php 文件
这个文件是 DedeCMS 上传功能的助手类,我们需要修改 UploadFile 类,让它在上传成功后,立即将文件上传到 OSS。

(图片来源网络,侵删)
找到 UploadFile 类中的 SaveTo 方法(大约在第 400 行左右),在方法最后,return $this->GetFilePath(); 这行代码之前,插入以下代码:
// ====== 以下是新增的 OSS 上传代码 ======
if ($this->GetFilePath() && file_exists($this->GetFilePath())) {
// 引入阿里云OSS SDK
require_once DEDEINC . '/oss/autoload.php';
// 检查是否开启OSS
if ($GLOBALS['cfg_oss_open'] == 'Y') {
// 从数据库配置中获取OSS参数
$ossEndpoint = $GLOBALS['cfg_oss_endpoint'];
$ossBucket = $GLOBALS['cfg_oss_bucket'];
$ossAccessId = $GLOBALS['cfg_oss_accessid'];
$ossAccessKey = $GLOBALS['cfg_oss_accesskey'];
$ossDir = trim($GLOBALS['cfg_oss_dir'], '/'); // 获取目录并去除首尾斜杠
try {
// 初始化OSSClient
$ossClient = new OssClient($ossAccessId, $ossAccessKey, $ossEndpoint);
// 构建OSS上的 object key (文件路径)
// 本地路径是 /uploads/allimg/20251020/123.jpg
// ossDir 是 'dede'
// OSS 路径是 /dede/allimg/20251020/123.jpg
$localFilePath = $this->GetFilePath();
$pathInfo = pathinfo($localFilePath);
$relativeDir = str_replace($pathInfo['basename'], '', str_replace(DedeSite::GetCfg('cfg_upload_dir'), '', $pathInfo['dirname']));
$ossObjectKey = $ossDir . $relativeDir . $pathInfo['basename'];
// 执行上传
$ossClient->uploadFile($ossBucket, $ossObjectKey, $localFilePath);
// (可选) 上传成功后,可以选择删除本地文件以节省空间
// @unlink($localFilePath);
// (重要) 将数据库中保存的图片路径替换为 OSS 的 URL
// 这一步非常重要,否则文章里显示的还是本地路径
$this->filePath = 'http://' . $ossBucket . '.' . $ossEndpoint . '/' . $ossObjectKey;
} catch (OssException $e) {
// 如果上传失败,记录错误日志,但不影响本地保存
// 可以打开下面的注释来调试
// echo $e->getMessage();
// exit;
}
}
}
// ====== OSS 上传代码结束 ======
代码解释:
require_once DEDEINC . '/oss/autoload.php';:自动加载我们之前上传的 OSS SDK。if ($GLOBALS['cfg_oss_open'] == 'Y'):检查后台是否开启了 OSS 功能。OssClient(...):使用配置的 AK、SK 和 Endpoint 初始化 OSS 客户端。uploadFile(...):将本地文件上传到 OSS。$this->filePath = 'http://'...:这是最关键的一步,它将上传类内部保存的文件路径,从本地路径(如/uploads/...)修改为 OSS 的公网 URL(如http://my-bucket.oss-cn-hangzhou.aliyuncs.com/dede/...),这样,当文章保存到数据库时,图片地址就已经是 OSS 地址了。
修改 /include/helpers/channelunit.helper.php 文件
这个文件包含了一些辅助函数,其中涉及到图片路径的处理,为了确保万无一失,我们最好也修改一下,防止出现路径问题。
找到 GetTruePath() 函数(大约在第 30 行左右),在函数开头 if(!preg_match("#^http://#", $str)) { 这行代码之前,添加一行代码:

(图片来源网络,侵删)
// 如果是阿里云OSS的URL,直接返回
if (preg_match("#^http://.*\.aliyuncs\.com/#", $str)) {
return $str;
}
if(!preg_match("#^http://#", $str)) {
// ... 原有代码 ...
}
这个修改是为了防止 DedeCMS 的其他功能错误地处理已经上传到 OSS 的图片路径,确保它被当作一个完整的 URL 直接返回。
第三步:测试与验证
- 清空缓存:登录 DedeCMS 后台,进入“系统” -> “系统基本参数” -> “性能选项”,点击“清空所有缓存”。
- 发布文章:
- 进入“核心” -> “内容发布” -> “添加普通文章”。
- 在编辑器中插入一张本地图片。
- 填写文章标题、内容等信息,然后点击“保存”。
- 检查结果:
- 检查文章内容:打开刚刚发布的文章,检查图片是否正常显示,如果显示正常,说明替换路径成功。
- 检查 OSS 控制台:登录阿里云 OSS 控制台,进入你的 Bucket,查看在
cfg_oss_dir设置的目录下(如dede/),是否已经成功上传了图片。 - 检查数据库:进入数据库,找到
#@__addonarticle或#@__archives表(根据你的文章模型),查看文章内容字段(如body),确认图片的src属性是否已经变成了 OSS 的 URL。
注意事项与进阶
- 性能考虑:上传到 OSS 会比上传到本地服务器多一步网络请求,可能会稍微增加一点发布文章的时间,但对于现代服务器和网络来说,这个影响通常可以忽略不计。
- 删除本地文件:如果你确定不再需要服务器上的本地副本,可以在
upload.helper.php中取消注释@unlink($localFilePath);这一行,实现上传 OSS 后自动删除本地文件。 - 错误处理:当前代码中 OSS 上传失败时会静默处理(不报错),以保证文章能正常发布到本地,如果需要调试,可以取消注释
echo $e->getMessage(); exit;来查看具体错误。 - 旧图片处理:这个方案只对新上传的图片有效,如果你想把网站已有的旧图片也迁移到 OSS,需要使用专门的 DedeCMS 图片搬家插件或编写脚本批量处理。
通过以上步骤,你就成功实现了在 DedeCMS 后台发布文章时,图片自动上传到阿里云 OSS 的功能。
