3.3 KiB
3.3 KiB
视频无法打开问题诊断
🔍 问题分析
当前文件路径情况
实际文件位置:D:\wwwroot\study_web\web\profile\upload\upload\2025\11\18\xxx.mp4
^^^^^^ 重复了!
路径生成逻辑
- 配置文件:
profile = D:\wwwroot\study_web\web\profile - RuoYiConfig.getUploadPath():
profile + "/upload"=D:\wwwroot\study_web\web\profile\upload - 文件上传时:在
uploadPath下再创建日期目录:upload/2025/11/18/ - 最终物理路径:
D:\wwwroot\study_web\web\profile\upload\2025\11\18\xxx.mp4✅ 正常
为什么会有两个 upload?
可能原因:
- 之前的配置是
profile = D:\wwwroot\study_web\web\profile\upload - 导致实际上传路径变成:
D:\wwwroot\study_web\web\profile\upload\upload\... - 文件已经上传到了错误的路径
URL 访问映射
URL 路径:/profile/**
映射到:file:D:\wwwroot\study_web\web\profile/
示例:
URL: http://192.168.0.106:30091/profile/upload/upload/2025/11/18/xxx.mp4
映射: D:\wwwroot\study_web\web\profile/upload/upload/2025/11/18/xxx.mp4
🔧 解决方案
方案一:移动文件到正确位置(推荐)
将文件从错误位置移动到正确位置:
从:D:\wwwroot\study_web\web\profile\upload\upload\2025\11\18\
到:D:\wwwroot\study_web\web\profile\upload\2025\11\18\
操作步骤:
-
备份数据库(重要!)
-
移动文件:
# 在 PowerShell 中执行 cd D:\wwwroot\study_web\web\profile\upload # 将 upload 子目录下的所有文件移动到当前目录 Move-Item -Path "upload\*" -Destination "." -Force # 删除空的 upload 目录 Remove-Item -Path "upload" -Recurse -Force -
更新数据库中的文件路径:
-- 更新课件表中的文件路径(去掉多余的 /upload) UPDATE study_courseware SET file_path = REPLACE(file_path, '/profile/upload/upload/', '/profile/upload/') WHERE file_path LIKE '/profile/upload/upload/%'; -- 检查更新结果 SELECT id, name, file_path FROM study_courseware WHERE file_path LIKE '/profile/upload/%' LIMIT 10; -
重启后端服务
-
测试视频访问
方案二:修改静态资源映射(临时方案)
如果不想移动文件,可以修改资源映射配置,让 /profile/upload/upload/ 也能访问到文件。
修改 ResourcesConfig.java:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 本地文件上传路径 */
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
.addResourceLocations("file:" + RuoYiConfig.getProfile() + "/")
.setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS).cachePublic())
.resourceChain(true);
// 临时方案:兼容旧的错误路径
registry.addResourceHandler("/profile/upload/upload/**")
.addResourceLocations("file:" + RuoYiConfig.getProfile() + "/upload/upload/")
.setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS).cachePublic())
.resourceChain(true);
}
缺点: 这只是临时方案,不解决根本问题。
方案三:批量修复(推荐用于生产环境)
创建一个批处理脚本自动修复: