2.4 KiB
2.4 KiB
文件上传逻辑分析与问题
🔴 严重问题:路径不一致
问题描述
当前代码存在路径不一致的严重问题:
-
FileService.createFile() 内部调用
generateUploadPath()生成路径- 使用
System.currentTimeMillis()作为时间戳 - 实际存储路径:
{baseDirectory}/{yyyyMMdd}/{filename}_{timestamp1}.ext
- 使用
-
我们手动调用 generateFullFilePath() 生成路径
- 也使用
System.currentTimeMillis()作为时间戳 - 但调用时间不同,时间戳可能不同:
{baseDirectory}/{yyyyMMdd}/{filename}_{timestamp2}.ext
- 也使用
-
结果:
filePath字段保存的路径 ≠ 实际 OSS 存储路径- 导致删除文件时无法找到正确的文件
- 导致路径查询不准确
时间戳不一致示例
FileService.createFile() 调用时间:2025-01-15 10:30:45.123
→ 生成时间戳:1736905845123
→ 实际路径:video/20250115/file_1736905845123.mp4
generateFullFilePath() 调用时间:2025-01-15 10:30:45.125(2毫秒后)
→ 生成时间戳:1736905845125
→ 保存路径:video/20250115/file_1736905845125.mp4
❌ 路径不匹配!
📋 冗余代码分析
1. generateFullFilePath() 方法
- 状态:冗余
- 原因:完全复制了
FileService.generateUploadPath()的逻辑 - 问题:时间戳不一致导致路径不匹配
2. extractPathFromUrl() 方法
- 状态:未使用
- 原因:创建了但从未调用
- 建议:删除或实现使用
✅ 解决方案
方案1:从 infra_file 表查询 path(推荐)
优点:
- 路径100%准确
- 可以关联 file_id
- 逻辑清晰
实现:
// 上传后,通过 URL 查询 infra_file 表获取 path
FileDO infraFile = fileMapper.selectOne(
new LambdaQueryWrapperX<FileDO>()
.eq(FileDO::getUrl, fileUrl)
.orderByDesc(FileDO::getCreateTime)
.last("LIMIT 1")
);
String filePath = infraFile != null ? infraFile.getPath() : null;
方案2:从 URL 中提取 path
优点:
- 不需要查询数据库
- 性能好
缺点:
- URL 可能包含域名、查询参数
- 提取逻辑复杂,可能不准确
方案3:修改 FileApi 返回 path(不推荐)
缺点:
- 需要修改框架代码
- 影响其他模块
🎯 推荐实现
使用方案1:从 infra_file 表查询 path,确保路径100%准确。