根据您描述的Discuz X3.4使用平安上传OSS插件后历史帖子图片不显示的情况,建议从以下六个维度排查处理:
1. **数据溯源处理**
- 在插件管理后台检查是否开启"历史附件迁移"功能(部分OSS插件需手动执行)
- 使用SQL命令查询旧帖子图片路径:`SELECT aid,attachment FROM pre_forum_attachment WHERE tid IN (旧帖子ID集)`
- 确认attachment字段是否已替换为OSS完整路径(如https://bucket.oss-cn-hangzhou.aliyuncs.com/...)
2. **模板适配改造**
- 在N7模板的forum目录中,检查discuzcode.func.php文件
- 定位图片渲染逻辑(约第320行),将:
- $attachurl = $_G['setting']['attachurl'];
复制代码
改为:
- $attachurl = function_exists('oss_get_attach_url') ? oss_get_attach_url() : $_G['setting']['attachurl'];
复制代码
3. **CDN缓存刷新**
- 若使用CDN加速,需登录CDN控制台执行:
- # 批量刷新历史URL(示例)
- curl -X POST "https://cdn.aliyuncs.com/?Action=RefreshObjectCaches" \
- -d "ObjectPath=forum/2023/*.jpg&ObjectType=Directory"
复制代码
4. **附件表结构验证**
- 检查pre_forum_attachment表是否存在oss_flag字段(标记是否已迁移)
- 若无该字段,需执行:
- ALTER TABLE pre_forum_attachment ADD oss_flag TINYINT(1) NOT NULL DEFAULT '0';
复制代码
5. **文件存储策略检查**
- 登录OSS控制台,查看Bucket的Lifecycle配置
- 确认未设置自动删除策略(如30天过期规则)
- 检查跨域设置CORS:
- <CORSRule>
- <AllowedOrigin>*</AllowedOrigin>
- <AllowedMethod>GET</AllowedMethod>
- <MaxAgeSeconds>3000</MaxAgeSeconds>
- </CORSRule>
复制代码
6. **插件钩子检测**
- 在source/plugin/平安上传目录中检查是否包含以下钩子:
- // 监听帖子解析事件
- $plugins['filter_postcontent'][] = array('class' => 'oss_plugin', 'method' => 'parse_old_attach');
复制代码
- 若缺失需补充钩子实现:
- class oss_plugin {
- public static function parse_old_attach($content) {
- return preg_replace_callback('/src="(.+?attachment\/.+?\.(jpg|png))"/i',
- function($matches) {
- return 'src="'.oss_convert_url($matches[1]).'"';
- }, $content);
- }
- }
复制代码
建议按照以下顺序执行操作:
1. 执行SQL结构变更(步骤4)
2. 刷新CDN缓存(步骤3)
3. 运行插件内置的批量迁移工具
4. 修改模板文件(步骤2)
5. 验证pre_forum_attachment表的oss_flag字段状态
6. 最后清理Discuz后台缓存
如仍存在问题,可通过phpMyAdmin导出pre_forum_attachment表中5条未迁移成功的数据样本,可进一步分析具体失败原因。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |