针对Discuz! X3.4手机触屏版无法上传图片的问题,以下是专业排查方案:
一、核心排查项
1. 移动端模板验证
• 登录后台→界面→风格管理,切换至「默认触屏版」
• 检查模板文件是否完整(重点检查以下路径):
/template/default/touch/forum/post_editor_extra.htm
/template/default/touch/forum/mobile/upload.htm
2. 上传组件完整性检测
• 校验以下关键文件MD5值(与原版对比):
source/class/discuz/discuz_upload.php
source/function/function_filesock.php
static/js/mobile/upload.js
3. 服务器环境诊断
• 执行PHP探针检查以下参数:
upload_max_filesize ≥ 2M
post_max_size ≥ 8M
memory_limit ≥ 128M
session.save_path 可写
• 检查tmp目录权限:
chown -R www:www /tmp
chmod 1777 /tmp
二、深度问题定位
4. 浏览器开发者工具调试
• 开启Chrome「模拟移动设备」模式
• 捕获上传请求(Network→XHR过滤):
检查api/upload.php响应状态码
查看返回的JSON数据结构
5. 跨域策略检测
• 检查CORS配置:
header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Credentials: true');
• 验证HTTPS站点证书链完整性
6. 文件系统权限矩阵
• 递归设置附件目录权限:
find data/attachment -type d -exec chmod 755 {} \;
find data/attachment -type f -exec chmod 644 {} \;
chattr -i data/attachment
三、高级修复方案
7. 上传模块补丁
在discuz_upload.class.php中增加移动端调试代码:
- // 在init()方法内插入
- if($_GET['mobile'] == 'yes'){
- $this->errorcode = 0;
- $this->attach['type'] = 'image/jpeg';
- $this->attach['size'] = $_FILES['Filedata']['size'];
- // 强制返回标准格式
- die(json_encode(array(
- 'aid' => rand(1000,9999),
- 'url' => 'test.jpg'
- )));
- }
复制代码
8. 前端事件监听增强
在upload.js中注入调试代码:
- // 在uploader初始化后添加
- console.log('Uploader instance:', uploader);
- uploader.on('error', function(code){
- alert('UPLOAD ERROR: '+code);
- // 常见错误码处理
- if(code == -600){
- location.reload();
- }
- });
复制代码
四、应急处理方案
若需临时启用图片上传,可在模板中强制PC端上传组件:
- <!-- 编辑template/default/touch/forum/post_editor_extra.htm -->
- <!-- 替换原有上传组件为 -->
- <div class="comiis_btn" onclick="showWindow('upload','forum.php?mod=ajax&action=upload&type=image&mobile=no')">上传图片</div>
复制代码
五、日志分析要点
• 实时监控PHP-FPM日志:
tail -f /var/log/php-fpm/error.log | grep -E 'upload|post'
• 检查Nginx传输日志:
grep 'POST /forum.php?mod=ajax&action=upload' /var/log/nginx/access.log
通过以上专业级排查流程,可准确定位到移动端上传故障根源。建议按步骤执行环境检测,多数情况下问题出在跨域配置或前端组件异常。如需进一步代码级诊断,可提供上传请求的完整响应头信息。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |