Files
hzdyjs/🔍出国申请下载失败诊断指南.md
T
2025-10-14 16:41:19 +08:00

7.7 KiB
Raw Blame History

🔍 出国申请下载失败诊断指南

问题现象:点击下载按钮提示"下载文件失败,请检查文件权限或稍后重试"

修复状态:

  • ✅ 数据库OSS ID已修复(7条记录全部成功)
  • ❓ 下载接口权限检查中

📊 当前状态

数据库验证

-- 所有已上传文件的OSS ID已正确关联
申请ID  盖章文件名                        盖章OSS_ID              状态
29      2.png                            1976838445737193474     ✅ 已修复
31      2.png                            1976838445737193474     ✅ 已修复
32      2.png                            1976838445737193474     ✅ 已修复
33      ??_009_1755917613198 (4).pdf     1976861922200408066     ✅ 已修复
34      ??_009_1755917613198 (4).pdf     1976861922200408066     ✅ 已修复
35      ??_009_1755917613198 (4).pdf     1976861922200408066     ✅ 已修复
36      ??_009_1755917613198 (4).pdf     1976861922200408066     ✅ 已修复

文件存储信息

OSS_ID: 1976838445737193474
文件名: 2025/10/11/074129a0770e41e09080c8f2b0001da0.png
原始名: 2.png
URL: http://47.99.164.66:20004/ruoyi/2025/10/11/074129a0770e41e09080c8f2b0001da0.png
服务: minio

🔍 诊断步骤

Step 1: 检查前端控制台错误(最重要!)

  1. 打开浏览器开发者工具

    • 按 F12 键
    • 切换到 Network(网络) 标签
  2. 清空之前的记录

    • 点击 Network 左上角的"清空"图标(禁止符号)
  3. 触发下载操作

    • 在出国申请列表中,点击任意已上传盖章文件的"查看详情"按钮
    • 点击"下载盖章文件"按钮
  4. 查看网络请求

    • 在 Network 标签中,找到 download/数字 这样的请求
    • 点击该请求,查看:
      • Request URL(请求地址)
      • Status Code(状态码)- 最重要!
      • Response(响应内容)

📝 请记录以下信息:

请求URL: ___________________________
状态码: ___________________________
响应内容: ___________________________

Step 2: 分析状态码

🔴 403 Forbidden - 权限不足

原因:用户没有 system:oss:download 权限

解决方案:

-- 检查用户权限
SELECT r.role_id, r.role_name, m.menu_id, m.menu_name, m.perms
FROM sys_role r
LEFT JOIN sys_role_menu rm ON r.role_id = rm.role_id
LEFT JOIN sys_menu m ON rm.menu_id = m.menu_id
WHERE r.role_id IN (
    SELECT role_id FROM sys_user_role 
    WHERE user_id = (SELECT user_id FROM sys_user WHERE user_name = 'admin' LIMIT 1)
)
AND m.perms = 'system:oss:download';

如果结果为空,需要添加权限:

-- 方案1:为角色添加OSS下载权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT ur.role_id, 1602
FROM sys_user_role ur
WHERE ur.user_id = (SELECT user_id FROM sys_user WHERE user_name = 'admin' LIMIT 1);

🔴 404 Not Found - 文件不存在

原因:OSS ID对应的文件在MinIO中不存在

解决方案:

-- 检查文件是否存在
SELECT oss_id, file_name, url, service
FROM sys_oss
WHERE oss_id = 1976838445737193474;

🔴 500 Internal Server Error - 服务器内部错误

原因:后端代码执行异常

解决方案:

  1. 检查后端日志:backend/logs/
  2. 查找关键词:secureDownload、checkFileAccessPermission
  3. 查看具体的异常堆栈信息

🔴 401 Unauthorized - 未授权

原因:Token失效或未传递

解决方案:

  1. 刷新页面重新登录
  2. 检查Token是否正确传递:
    // 在浏览器控制台运行
    console.log('Token:', localStorage.getItem('Admin-Token'));
    

Step 3: 检查MinIO文件是否存在

方法1:直接访问MinIO URL

打开浏览器,访问:

http://47.99.164.66:20004/ruoyi/2025/10/11/074129a0770e41e09080c8f2b0001da0.png

预期结果:

  • ✅ 能看到图片或下载文件 → MinIO文件存在
  • ❌ 404错误 → MinIO文件已被删除

Step 4: 检查后端下载接口实现

接口位置:

  • Controller: SysOssController.java 第96行
  • Service: SysOssServiceImpl.java 第404行

权限要求:

@SaCheckPermission("system:oss:download")  // 需要此权限
@GetMapping("/download/{ossId}")
public void secureDownload(@PathVariable("ossId") Long ossId, HttpServletResponse response)

权限检查逻辑:

public boolean checkFileAccessPermission(Long ossId) {
    // 1. 文件必须存在
    SysOssVo oss = getById(ossId);
    if (ObjectUtil.isNull(oss)) {
        return false;
    }
    
    // 2. 用户必须已登录
    try {
        Long userId = LoginHelper.getUserId();
        if (ObjectUtil.isNull(userId)) {
            return false;
        }
    } catch (Exception e) {
        return false;
    }
    
    // 3. 其他业务权限检查(已注释,默认通过)
    
    return true;
}

🔧 快速修复方案

方案1:临时开放权限(测试用)

如果确认是权限问题,可以临时注释掉权限检查:

// 临时修改 SysOssController.java
// @SaCheckPermission("system:oss:download")  // 注释掉这行
@GetMapping("/download/{ossId}")
public void secureDownload(@PathVariable("ossId") Long ossId, HttpServletResponse response) {
    // ...
}

⚠️ 注意:这只是测试方案,生产环境不要这样做!

方案2:为admin角色添加OSS下载权限

-- 查找OSS下载权限的menu_id
SELECT menu_id, menu_name, perms 
FROM sys_menu 
WHERE perms = 'system:oss:download';

-- 为admin所属的角色添加权限(假设admin的role_id是1)
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, menu_id
FROM sys_menu
WHERE perms = 'system:oss:download'
LIMIT 1;

方案3:使用自定义下载接口(推荐)

在 RsOverseasApplicationController 中已经有自定义下载接口:

@SaCheckPermission("rs:overseas:query")  // 使用出国申请的查询权限
@GetMapping("/downloadStampedFile/{applicationId}")
public void downloadStampedFile(@PathVariable Long applicationId, HttpServletResponse response)

前端可以改用这个接口:

const handleDownloadStampedFile = async (data: OverseasApplicationVO) => {
  try {
    // 改用自定义接口
    const response = await request({
      url: `/rs/overseas/application/downloadStampedFile/${data.applicationId}`,
      method: 'get',
      responseType: 'blob'
    });
    
    // ... 下载逻辑
  } catch (error) {
    console.error('下载失败:', error);
  }
};

📝 调试清单

请按顺序检查以下项目:

  • 前端控制台Network - 查看下载请求的状态码和响应
  • Token有效性 - 确认Token存在且未过期
  • 用户权限 - 确认用户有 system:oss:download 权限
  • 文件存在性 - 确认sys_oss表中有该文件记录
  • MinIO可访问 - 确认MinIO服务正常且文件存在
  • 后端日志 - 查看是否有异常信息

🎯 下一步操作

请您:

  1. 打开浏览器开发者工具 (F12)
  2. 切换到Network标签
  3. 点击下载按钮
  4. 截图或复制以下信息告诉我:
    • 请求URL
    • 状态码
    • Response(响应内容的前100个字符)

这样我就能准确判断问题所在并提供解决方案!


🛠️ 测试工具

我创建了一个Python测试脚本:test_with_browser_token.py

使用方法:

cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project
python3 test_with_browser_token.py

然后从浏览器中复制Token进行测试。


创建时间:2025-10-11
问题阶段:下载权限诊断中
需要用户提供:Network标签中的请求详细信息