You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

386 lines
19 KiB

1 month ago
# 文件预览
<cite>
**本文引用的文件**
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
- [FileConstants.java](file://crm-file/src/main/java/com/crm/file/constant/FileConstants.java)
- [MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java)
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本技术文档围绕“文件预览”能力,重点阐述与KKFileView的集成方案、支持的文档格式、预览参数配置、URL生成与参数传递、缓存策略、不同文件格式的转换与渲染机制,以及客户端调用示例与常见问题解决方案。该功能通过统一的文件服务模块对外暴露接口,内部通过HTTP客户端调用外部KKFileView服务完成在线预览,结合对象存储(如MinIO)进行文件存取,并提供分片上传与会话清理等配套能力。
## 项目结构
文件预览相关代码集中在 crm-file 模块中,主要包含控制器、服务实现、API定义、领域模型、配置与定时任务等。应用入口与全局配置位于 crm-app 模块。
```mermaid
graph TB
subgraph "crm-file"
FC["FileController<br/>文件控制器"]
API["FileApi<br/>文件API接口"]
SVC["FileApiImpl<br/>文件服务实现"]
KKV["KkFileViewClient<br/>KKFileView客户端"]
FInfoSvc["FileInfoServiceImpl<br/>文件信息服务实现"]
FInfoMapper["FileInfoMapper<br/>文件信息持久化"]
FInfoEntity["FileInfo<br/>文件信息实体"]
DTOs["DTOs<br/>FileInfoDTO / FileDownloadDTO / MultipartInitDTO / UploadSession"]
Const["FileConstants<br/>常量"]
MinioCfg["MinioConfig<br/>对象存储配置"]
SchedCfg["SchedulingConfig<br/>调度配置"]
Task["OrphanChunkCleanupTask<br/>分片清理任务"]
end
subgraph "crm-app"
AppYml["application.yml<br/>应用配置"]
end
FC --> API
FC --> SVC
SVC --> KKV
SVC --> FInfoSvc
FInfoSvc --> FInfoMapper
FInfoSvc --> FInfoEntity
SVC --> DTOs
SVC --> Const
SVC --> MinioCfg
SVC --> SchedCfg
Task --> SchedCfg
AppYml --> FC
```
图表来源
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
- [FileConstants.java](file://crm-file/src/main/java/com/crm/file/constant/FileConstants.java)
- [MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java)
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
章节来源
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
## 核心组件
- 文件控制器:提供文件上传、下载、预览等HTTP端点,统一接收请求并委派给服务层处理。
- 文件服务实现:封装业务逻辑,协调对象存储、文件元数据与KKFileView预览服务。
- KKFileView客户端:负责构造预览URL、发起HTTP请求、处理响应与异常。
- 文件信息服务:维护文件元数据(名称、大小、类型、存储路径等),提供查询与更新能力。
- 对象存储配置:对接MinIO或兼容S3的对象存储服务,用于文件读写。
- 定时任务:清理未完成的分片上传会话,避免资源泄漏。
章节来源
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
- [MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java)
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
## 架构总览
整体流程为:前端调用文件服务接口,服务层根据文件ID或路径从对象存储获取文件流或直链,再调用KKFileView生成预览页面;对于受控访问场景,可通过签名URL或鉴权中间件保障安全。
```mermaid
sequenceDiagram
participant FE as "前端"
participant FC as "文件控制器"
participant FS as "文件服务实现"
participant OS as "对象存储(如MinIO)"
participant KKV as "KKFileView服务"
participant DB as "文件信息持久化"
FE->>FC : "请求预览(文件ID/路径)"
FC->>FS : "解析参数, 校验权限"
FS->>DB : "查询文件元数据"
DB-->>FS : "返回文件信息"
FS->>OS : "获取文件流或签名直链"
OS-->>FS : "返回文件数据/链接"
FS->>KKV : "构造预览URL并请求"
KKV-->>FS : "返回预览HTML/重定向"
FS-->>FC : "返回预览结果"
FC-->>FE : "展示预览页面"
```
图表来源
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
## 详细组件分析
### 文件控制器(FileController)
- 职责:接收文件上传、下载、预览等请求,参数校验后委派给服务层。
- 关键点:
- 统一错误处理与响应封装。
- 支持多端点复用(上传、分片、合并、下载、预览)。
- 与权限/鉴权体系集成(如有)。
章节来源
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
### 文件服务实现(FileApiImpl)
- 职责:实现文件API的业务编排,包括:
- 文件上传(含分片上传与会话管理)。
- 文件下载(流式输出或直链跳转)。
- 文件预览(调用KKFileView客户端生成预览)。
- 文件信息查询(名称、大小、类型、存储位置等)。
- 关键点:
- 与对象存储交互(读取/写入文件)。
- 与文件信息持久化层协作(增删改查)。
- 与KKFileView客户端协作,构建预览URL并处理响应。
章节来源
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
### KKFileView客户端(KkFileViewClient)
- 职责:封装对KKFileView服务的HTTP调用,负责:
- 构造预览URL(包含文件地址、预览参数、鉴权信息等)。
- 发起请求并处理响应(HTML内容或重定向)。
- 异常处理与重试策略(可选)。
- 关键点:
- 支持多种文档格式的预览参数配置。
- 可配置超时、重试、代理等网络参数。
- 与对象存储直链或临时签名URL配合使用。
章节来源
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
### 文件信息服务(FileInfoServiceImpl)
- 职责:维护文件元数据的持久化与查询,包括:
- 文件基本信息(名称、大小、类型、创建时间等)。
- 存储位置(桶名、键名、版本等)。
- 关联关系(用户、部门、项目等,视业务而定)。
- 关键点:
- 与MyBatis Plus Mapper协作进行CRUD操作。
- 提供分页、条件查询、批量更新等能力。
章节来源
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
### 领域模型与DTO
- FileInfo:文件信息实体,映射数据库表结构。
- FileInfoDTO:文件信息数据传输对象,用于接口输入输出。
- FileDownloadDTO:下载请求参数封装。
- MultipartInitDTO:分片上传初始化参数。
- UploadSession:分片上传会话状态。
章节来源
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
- [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java)
- [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java)
- [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java)
- [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java)
### 常量与配置
- FileConstants:文件相关常量(如扩展名、MIME类型、默认值等)。
- MinioConfig:对象存储连接配置(端点、凭据、桶名等)。
- SchedulingConfig:定时任务开关与调度周期。
- application.yml:应用级配置(端口、日志、第三方服务地址等)。
章节来源
- [FileConstants.java](file://crm-file/src/main/java/com/crm/file/constant/FileConstants.java)
- [MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java)
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
### 定时任务(OrphanChunkCleanupTask)
- 职责:定期扫描并清理未完成的分片上传会话,释放存储空间。
- 关键点:
- 基于时间阈值判断过期会话。
- 幂等删除,避免重复清理。
- 与调度框架集成,支持动态启停。
章节来源
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
## 依赖关系分析
- 控制器依赖服务实现,服务实现依赖KKFileView客户端、文件信息服务与对象存储配置。
- 文件信息服务依赖持久化层(Mapper)与实体。
- 定时任务依赖调度配置与文件会话存储(如Redis或数据库)。
```mermaid
classDiagram
class FileController {
+上传()
+下载()
+预览()
}
class FileApiImpl {
+上传()
+下载()
+预览()
+查询()
}
class KkFileViewClient {
+构造预览URL()
+请求预览()
+处理响应()
}
class FileInfoServiceImpl {
+新增()
+查询()
+更新()
+删除()
}
class FileInfoMapper
class FileInfo
class MinioConfig
class SchedulingConfig
class OrphanChunkCleanupTask
FileController --> FileApiImpl : "调用"
FileApiImpl --> KkFileViewClient : "调用"
FileApiImpl --> FileInfoServiceImpl : "调用"
FileInfoServiceImpl --> FileInfoMapper : "使用"
FileInfoServiceImpl --> FileInfo : "操作"
FileApiImpl --> MinioConfig : "配置"
OrphanChunkCleanupTask --> SchedulingConfig : "依赖"
```
图表来源
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java)
- [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.java)
- [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java)
- [MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java)
- [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
## 性能考虑
- 预览服务缓存:
- 在KKFileView侧启用缓存,减少重复转换开销。
- 在服务层对热门文件的预览URL或HTML内容进行短期缓存(注意失效策略)。
- 对象存储优化:
- 使用直链或签名URL减少服务端中转流量。
- 合理设置分块大小与并发数,提升上传/下载吞吐。
- 网络与超时:
- 调整KKFileView客户端的超时与重试参数,避免长尾延迟。
- 使用连接池与HTTP/2提升并发能力。
- 资源隔离:
- 将预览服务与主业务服务解耦部署,避免相互影响。
- 监控与告警:
- 记录关键指标(QPS、耗时、失败率、缓存命中率)。
- 对异常与慢请求进行告警。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 预览失败:
- 检查KKFileView服务是否可达、端口与协议是否正确。
- 确认文件地址是否为有效直链或签名URL。
- 查看客户端日志中的HTTP状态码与错误信息。
- 权限问题:
- 若对象存储启用私有桶,确保签名URL有效期足够且权限正确。
- 若KKFileView需要鉴权,确认Token或Cookie传递正确。
- 内存与CPU过高:
- 调整KKFileView的JVM参数与线程池大小。
- 限制并发预览数量,避免过载。
- 分片上传残留:
- 检查定时任务是否正常运行,清理过期会话。
- 手动清理无效分片,释放空间。
章节来源
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
## 结论
本方案通过统一文件服务与KKFileView客户端集成,实现了多格式文档的在线预览能力。结合对象存储与完善的元数据管理,提供了稳定、可扩展的文件预览服务。通过合理的配置与优化策略,可在高并发场景下保持良好性能与稳定性。
[本节为总结性内容,不直接分析具体文件]
## 附录
### 支持的文档格式与预览原理
- PDF:直接渲染或转换为HTML/图片,适合复杂排版。
- Word(doc/docx):转换为PDF或HTML后再渲染,保留基本样式。
- Excel(xls/xlsx):转换为HTML表格或图片,支持分页与缩放。
- PPT(ppt/pptx):转换为PDF或图片序列,逐页展示。
- 其他:TXT、CSV、XML、JSON等文本类可直接渲染。
说明:实际支持范围取决于KKFileView后端能力与依赖库。
[本节为概念性说明,不直接分析具体文件]
### 预览URL生成与参数传递
- URL组成:基础地址 + 文件路径/直链 + 预览参数(如zoom、page、theme等)。
- 参数传递:
- 文件地址:优先使用对象存储直链或签名URL。
- 鉴权信息:通过Header或Query参数传递(视KKFileView配置)。
- 渲染选项:控制缩放、主题、水印等。
- 安全性:
- 对敏感文件使用短期签名URL。
- 在网关层增加访问控制与限流。
章节来源
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
### 缓存策略
- 预览HTML缓存:对热点文件缓存生成的HTML片段,设置合理TTL。
- 直链缓存:对签名URL进行短期缓存,避免频繁生成。
- 反向代理缓存:在Nginx或CDN层缓存静态资源(图片、CSS、JS)。
[本节为概念性说明,不直接分析具体文件]
### 客户端调用示例(步骤)
- 上传文件:调用上传接口,获得文件ID或直链。
- 生成预览URL:调用预览接口,传入文件标识与可选参数。
- 展示预览:在前端iframe或新窗口打开预览URL。
- 下载文件:调用下载接口,获取文件流或直链。
章节来源
- [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
- [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
### 常见问题解决方案
- 预览空白或乱码:检查字体与编码,确保KKFileView环境完整。
- 大文件预览慢:启用分页加载与懒渲染,限制并发。
- 跨域问题:配置CORS允许前端域名访问预览服务。
- 权限拒绝:核对对象存储权限与签名有效性。
章节来源
- [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)