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
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)
|