Files
sionrui/yudao-module-tik/LOGIC_ANALYSIS.md
2025-11-16 19:35:55 +08:00

2.4 KiB
Raw Blame History

文件上传逻辑分析与问题

🔴 严重问题:路径不一致

问题描述

当前代码存在路径不一致的严重问题:

  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.1252毫秒后
  → 生成时间戳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%准确。