关于Discuz审核机制导致附件丢失的问题,经过技术排查可能存在以下核心原因及解决方案:
一、核心机制分析
1. Discuz的审核队列(pre_common_approve表)对附件的处理逻辑:
- 待审帖子的附件会暂时存放在attachment_unused表
- 审核通过时才会迁移到attachment表并与帖子关联
- 审核不通过时系统会默认清理未使用的附件
二、针对系统附件的解决方案
1. 修改审核后处理逻辑(需二次开发):
在source/module/forum/forum_ajax_archive.php文件中增加:
- // 审核通过时关联附件
- if($archive && $archive['status'] == 1) {
- C::t('forum_attachment_unused')->update($attach['aid'], array(
- 'tid' => $archive['tid'],
- 'pid' => $archive['pid']
- ));
- }
复制代码
2. 修改自动清理策略:
在后台设置路径:【全局】->【上传设置】->【本地附件保存时间】设置为0(禁止自动清理)
三、针对第三方网盘插件的解决方案
1. 通用处理方案:
在插件的钩子文件中(如hook.class.php)增加审核状态判断:
- public function viewthread_attachment_data($data) {
- if($data['is_approved'] == 0) {
- $data['netdisk_url'] = get_unapproved_url($data['url']);
- }
- return $data;
- }
复制代码
2. 深度兼容开发方案:
在插件的发布流程中增加审核状态标记:
- // 发帖时保存原始数据
- $extfield = array(
- 'netdisk_data' => serialize($_POST['netdisk']),
- 'is_approved' => 0
- );
- C::t('forum_threadclass')->insert_extend($extfield);
- // 审核通过时恢复数据
- if($archive['status'] == 1) {
- $netdiskData = unserialize($extfield['netdisk_data']);
- plugin_netdisk::save_data($netdiskData);
- }
复制代码
四、系统配置注意事项
1. 检查用户组权限:【用户组】->【论坛相关】->【附件相关】确保"需要审核时保留附件"已勾选
2. 验证版块设置:各版块【版块权限】中"审核通过后显示附件"需设置为是
3. 检查cron任务:关闭清理未使用附件的定时任务(cleanup_monthly.php)
五、数据库修复方案(执行前请备份)
对于已丢失的附件数据,可通过SQL修复:
- UPDATE pre_forum_attachment a
- INNER JOIN pre_common_approve b ON a.tid = b.tid
- SET a.tid = b.tid, a.pid = b.pid
- WHERE b.status = 1 AND a.tid = 0;
复制代码
建议开发者根据实际使用场景选择对应的解决方案组合。如需进一步的技术支持,可提供FTP权限和后台临时账号供我们技术团队进行深度排查。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |