dede后台发布文章如何自动同步到oss?

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

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

dede后台发布文章自动发到oss
(图片来源网络,侵删)
  1. 配置 OSS 参数:在 DedeCMS 后台添加 OSS 的配置信息。
  2. 修改核心代码:让 DedeCMS 在上传图片时自动调用 OSS SDK 进行上传。

准备工作

  1. 阿里云 OSS 账号:确保你已经有一个开通了 OSS 服务的阿里云账号。
  2. AccessKey:拥有 AliyunOSSFullAccess(或至少 oss:PutObjectoss:ListBucket 等权限)的 AccessKey IDAccessKey Secret
  3. Bucket 信息:你的 Bucket 名称Endpoint(地域节点地址,如 oss-cn-hangzhou.aliyuncs.com)。
  4. PHP 环境:你的服务器必须安装了 cURL 扩展,因为 OSS SDK 依赖它。
  5. 下载 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 的配置项,方便以后修改。

  1. 打开数据库管理工具(如 phpMyAdmin)。
  2. 找到你的 DedeCMS 数据库,找到 #@__sysconfig 这张表。
  3. 点击“插入”新行,或者找到一条 varnamecfg_ftp_host 的记录进行修改(推荐新增,避免冲突)。
  4. 添加以下几行配置:
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。

dede后台发布文章自动发到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)) { 这行代码之前,添加一行代码:

dede后台发布文章自动发到oss
(图片来源网络,侵删)
// 如果是阿里云OSS的URL,直接返回
if (preg_match("#^http://.*\.aliyuncs\.com/#", $str)) {
    return $str;
}
if(!preg_match("#^http://#", $str)) {
    // ... 原有代码 ...
}

这个修改是为了防止 DedeCMS 的其他功能错误地处理已经上传到 OSS 的图片路径,确保它被当作一个完整的 URL 直接返回。


第三步:测试与验证

  1. 清空缓存:登录 DedeCMS 后台,进入“系统” -> “系统基本参数” -> “性能选项”,点击“清空所有缓存”。
  2. 发布文章
    • 进入“核心” -> “内容发布” -> “添加普通文章”。
    • 在编辑器中插入一张本地图片。
    • 填写文章标题、内容等信息,然后点击“保存”。
  3. 检查结果
    • 检查文章内容:打开刚刚发布的文章,检查图片是否正常显示,如果显示正常,说明替换路径成功。
    • 检查 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 的功能。

-- 展开阅读全文 --
头像
织梦CMS投票调查为何无法显示?
« 上一篇 2025-12-15
C语言程序设计(第二版)谭浩强核心难点是什么?
下一篇 » 2025-12-15

相关文章

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

目录[+]