7.7 KiB
7.7 KiB
🔍 出国申请下载失败诊断指南
问题现象:点击下载按钮提示"下载文件失败,请检查文件权限或稍后重试"
修复状态:
- ✅ 数据库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: 检查前端控制台错误(最重要!)
-
打开浏览器开发者工具
- 按
F12键 - 切换到 Network(网络) 标签
- 按
-
清空之前的记录
- 点击 Network 左上角的"清空"图标(禁止符号)
-
触发下载操作
- 在出国申请列表中,点击任意已上传盖章文件的"查看详情"按钮
- 点击"下载盖章文件"按钮
-
查看网络请求
- 在 Network 标签中,找到
download/数字这样的请求 - 点击该请求,查看:
- Request URL(请求地址)
- Status Code(状态码)- 最重要!
- Response(响应内容)
- 在 Network 标签中,找到
📝 请记录以下信息:
请求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 - 服务器内部错误
原因:后端代码执行异常
解决方案:
- 检查后端日志:
backend/logs/ - 查找关键词:
secureDownload、checkFileAccessPermission - 查看具体的异常堆栈信息
🔴 401 Unauthorized - 未授权
原因:Token失效或未传递
解决方案:
- 刷新页面重新登录
- 检查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服务正常且文件存在
- 后端日志 - 查看是否有异常信息
🎯 下一步操作
请您:
- 打开浏览器开发者工具 (F12)
- 切换到Network标签
- 点击下载按钮
- 截图或复制以下信息告诉我:
- 请求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标签中的请求详细信息