easy云盘笔记
1. 文件上传流程
-
初始化上传
- 检查
fileId
是否为空,如果为空则生成一个随机的fileId
。 - 获取当前用户的存储空间信息(通过
redisComponent.getUserSpaceUse
)。 - 如果是第一个分片(
chunkIndex == 0
),检查文件是否已存在(通过fileMd5
查询数据库),如果存在则直接秒传。
- 检查
-
秒传逻辑
- 如果文件已存在,检查用户存储空间是否足够。
- 更新文件信息(如
fileId
、filePid
、userId
等)并插入数据库。 - 更新用户存储空间使用情况。
-
分片上传
- 创建临时目录(
tempFileFolder
)用于存储分片文件。 - 检查用户存储空间是否足够。
- 将分片文件保存到临时目录中,并更新临时文件大小到 Redis。
- 创建临时目录(
-
分片上传完成
- 如果是最后一个分片,记录文件信息到数据库,状态为
TRANSFER
。 - 更新用户存储空间使用情况。
- 事务提交后,异步调用
transferFile
方法进行文件合并和转码。
- 如果是最后一个分片,记录文件信息到数据库,状态为
-
异常处理
- 如果上传失败,删除临时目录。
2. 文件合并与转码流程(异步)
-
文件合并
- 检查文件状态是否为
TRANSFER
。 - 将临时目录中的所有分片文件合并为一个完整的文件。
- 将合并后的文件移动到目标目录。
- 检查文件状态是否为
-
文件转码
- 如果是视频文件,进行转码(如 HEVC 转 H.264)。
- 生成视频切片(
.ts
文件)和索引文件(.m3u8
)。 - 如果是图片文件,生成缩略图。
-
视频分片处理
- 创建切片目录:根据视频文件路径创建一个同名切片目录。
- 检测视频编码格式:使用
ffprobe
检测视频编码格式,如果是 HEVC 编码,则将其转码为 H.264。 - 生成
.ts
文件:使用ffmpeg
将视频文件转换为.ts
格式。 - 生成
.m3u8
索引文件:使用ffmpeg
将.ts
文件切片,并生成.m3u8
索引文件。 - 清理临时文件:删除中间生成的
.ts
文件。
-
更新文件状态
- 更新文件信息(如文件大小、封面、状态等)到数据库。
3. 重要知识点
-
分片上传
- 支持大文件分片上传,通过
chunkIndex
和chunks
参数管理分片。 - 使用临时目录存储分片文件,最后合并为一个完整文件。
- 支持大文件分片上传,通过
-
秒传机制
- 通过
fileMd5
校验文件是否已存在,避免重复上传。 - 如果文件已存在,直接更新文件信息和用户存储空间。
- 通过
-
存储空间管理
- 使用 Redis 缓存用户存储空间使用情况。
- 每次上传前检查用户存储空间是否足够。
-
异步处理
- 使用
@Async
注解实现异步文件合并和转码。 - 通过
TransactionSynchronizationManager.registerSynchronization
确保事务提交后执行异步任务。
- 使用
-
文件合并
- 使用
RandomAccessFile
实现分片文件的合并。 - 支持删除临时目录以释放存储空间。
- 使用
-
文件转码
- 使用
ffmpeg
进行视频转码和切片。 - 生成视频缩略图和图片缩略图。
- 使用
-
视频分片处理
- 切片目录:为每个视频文件创建一个切片目录,用于存储
.ts
文件和.m3u8
索引文件。 - 编码检测:使用
ffprobe
检测视频编码格式,确保兼容性。 - 切片生成:使用
ffmpeg
将视频文件切片,并生成.m3u8
索引文件。
- 切片目录:为每个视频文件创建一个切片目录,用于存储
-
异常处理
- 使用
try-catch
捕获异常,确保上传失败时清理临时文件。 - 自定义
BusinessException
处理业务异常。
- 使用
-
事务管理
- 使用
@Transactional
注解管理事务,确保数据一致性。 - 在事务提交后执行异步任务,避免事务未提交导致的数据不一致问题。
- 使用
-
文件存储结构
- 临时文件存储在
temp
目录中,合并后移动到file
目录。 - 文件路径按月份分类,便于管理和查询。
- 临时文件存储在
-
Redis 缓存
- 使用 Redis 缓存临时文件大小和用户存储空间使用情况,提高性能。
4. 优化建议
-
分片上传优化
- 支持断点续传,记录已上传的分片信息。
- 增加分片大小和并发上传的配置项。
-
秒传优化
- 使用分布式文件存储(如 MinIO、FastDFS)提高文件查询效率。
- 增加文件分块校验,确保文件完整性。
-
转码优化
- 使用分布式任务队列(如 RabbitMQ、Kafka)处理转码任务,提高并发能力。
- 增加转码任务的优先级和重试机制。
-
存储优化
- 使用对象存储服务(如 AWS S3、阿里云 OSS)替代本地存储,提高扩展性和可靠性。
- 增加文件冷热分离策略,降低存储成本。
-
安全性优化
- 增加文件上传的权限校验,防止非法用户上传文件。
- 对上传文件进行病毒扫描,确保文件安全。
5. 总结
该上传功能实现了分片上传、秒传、文件合并和转码等核心功能,结合 Redis 缓存和异步处理提高了性能和用户体验。通过事务管理和异常处理确保了数据的一致性和可靠性。视频分片处理是其中的重要环节,通过 ffmpeg
实现视频切片和索引文件的生成,为视频播放提供了支持。后续可以通过分布式存储和任务队列进一步提升系统的扩展性和并发能力。