# 文件上传逻辑分析与问题 ## 🔴 严重问题:路径不一致 ### 问题描述 当前代码存在**路径不一致**的严重问题: 1. **FileService.createFile()** 内部调用 `generateUploadPath()` 生成路径 - 使用 `System.currentTimeMillis()` 作为时间戳 - 实际存储路径:`{baseDirectory}/{yyyyMMdd}/{filename}_{timestamp1}.ext` 2. **我们手动调用 generateFullFilePath()** 生成路径 - 也使用 `System.currentTimeMillis()` 作为时间戳 - 但调用时间不同,时间戳可能不同:`{baseDirectory}/{yyyyMMdd}/{filename}_{timestamp2}.ext` 3. **结果**:`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 - 逻辑清晰 **实现**: ```java // 上传后,通过 URL 查询 infra_file 表获取 path FileDO infraFile = fileMapper.selectOne( new LambdaQueryWrapperX() .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%准确。