KKFileView使用指北
需求
- 比较好的word,ppt,xlsx的预览效果
- 内网可用,可以独立部署
- 可作为公共解决方案
和其他解决方案对比
所有的解决方案实质上都是调用某office的服务来实现的,根据采用的office类型可以大致分为两类
- 在windows服务器使用msoffice进行转换
- 使用libreoffice或openoffice在linux服务器上进行转换
jobconverter和unoconv都支持以上所有的服务调用。
语言 | 转换器 | 效果 | 使用方式 | |
---|---|---|---|---|
KKFileView | java | JODConverter | 较好(不可调节) | 直接生成预览url |
gotenberg | go | unoconv | 一般,excel预览存在问题(不可调节) | 提供api供调用 |
unoconv | python | 可调节 | 提供命令行供调用 |
存在问题
- 无权限控制,复制url给任何人都可以打开预览
- url参数是用户可控的,通过修改此参数,可触发SSRF漏洞。虽然可以指定trust.host来限制url,但也会暴露下载地址
- 预览失败页面有反馈群[doge]
修改
KKFileView是基于Spring的项目,可以添加Filter来处理。修改后的代码地址
-
增加auth控制
# 是否启用权限校验 auth.enabled = ${KK_AUTH_ENABLED:true} # 授权验证的回调地址 auth.url = ${KK_AUTH_URL:http://127.0.0.1:7001/auth} # 回调验证的json的路径 auth.success-path = ${KK_AUTH_SUCCESS_PATH:success}
下载文件前,会将用户的url转发给授权服务来进行判断,无权限则提供预览服务
-
增加download-prefix处理
# 支持下载资源url不指定完整路径 base.download-prefix = ${KK_DOWNLOAD_PREFIX:http://127.0.0.1:7001}
下载时会读取prefix和用户输入的部分拼接 从而实现隐藏实际下载路径的目的
部署
-
打包
mvn clean package -DskipTests -Prelease
-
生成镜像
docker build -t keking/kkfileview .
-
发布镜像到私有仓库
docker login your_repo docker tag keking/kkfileview your_repo/kkfileview:1.0 docker push your_repo/kkfileview:1.0
-
文件服务实现下载和权限控制接口,并提供预览链接给前端
-
修改 docker-compose
kkfileview: restart: always image: your_repo/kkfileview:1.0 containner_name: kkfileview volumes: - ./kkfileview:/opt/kkFileView-2.2.1/config
你可以通过修改自己目录的application.properties来控制容器启动时的配置
-
修改nginx转发
- 修改 application.properties
base.url = ${KK_BASE_URL:your_domain}
-
修改 nginx配置,增加转发
location /preview/ { proxy_pass http://127.0.0.1:8012; }
Tips
-
url参数
由于下载地址时一个接口,kkfileview无法从地址获取到文件名,所以需要显示声明fullfilename=xxx。此外由于增加了权限控制,所以url中还包括了用来校验的token数据。这些构成完整的url后,还需使用encodeURIComponent进行处理。
-
docker换源,以及发布
docker本身的源太慢了,可以修改
"registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn" ],
此外发布时,最好带上版本信息,以免都使用latest导致如果有更新,使用方无法获取到。其实
latest
就是个普通标签,不要期望它是最新或最稳定的版本。它只是个名字,没有其它附加作用,更不会自动更新。