夜雨聆风学习资料网

ARTICLE · 1087681

Word、Excel、PDF不用下载:用kkFileView搭一套私有在线预览服务

Word、Excel、PDF不用下载:用kkFileView搭一套私有在线预览服务
做内部系统久了,总会遇到一个看起来不大、却反复消耗人的问题:文件已经上传成功,但用户点开以后,还是得先下载。
Word要找Office,CAD图纸要找看图软件,压缩包得解开,OFD又是另一套工具。手机上更麻烦,有时候只是想确认一页内容,却要在几个应用之间来回跳。
开发侧也不轻松。
知识库做一套PDF预览,合同系统再做一套Office转码,项目管理系统又单独接图片和视频。每个系统都在解决相似的问题,却各自维护一套组件、缓存和异常处理。
最近我重新看了一遍kkFileView,觉得它值得认真推荐。不是因为它支持的格式列表很长,而是它把一个容易被低估的能力,做成了可以独立部署的基础服务:
业务系统只管保存文件和提供地址,预览这件事交给统一的预览服务。
而且这套服务可以放在自己的服务器、NAS或内网环境里,不必把文件交给第三方在线转换网站。
一、kkFileView解决的不是“打开文件”,而是统一预览入口
kkFileView是一个基于Spring Boot的开源文件在线预览项目,使用Apache-2.0许可证。部署后,它可以独立提供HTTP预览入口,原来的Java、Go、PHP或前端系统不需要和它深度绑定。
它支持的格式很广:
  • Word、Excel、PowerPoint、WPS和OpenDocument;
  • PDF、OFD、RTF、Visio、XMind、BPMN;
  • DWG、DXF等CAD文件和多种3D模型;
  • ZIP、RAR、7z、TAR等压缩包;
  • 图片、音频、视频、Markdown、代码和纯文本;
  • EML、EPUB、Draw.io、DICOM等相对特殊的格式。
但我不太想把它写成一篇“支持多少种格式”的功能清单。
真正有价值的是,用户面对不同文件时,不必再关心背后用的是PDF.js、LibreOffice、CAD转换器还是浏览器原生能力。业务系统也不必为每一种格式单独选择预览组件。
从使用者视角看,就是点一下“预览”;从系统视角看,则是把格式识别、下载、转换、缓存和展示收进同一个入口。
二、为什么我更建议私有化部署
网上并不缺临时预览和格式转换网站。偶尔看一份公开资料,它们很方便;但当文件来自合同系统、客户资料、研发文档或家庭NAS时,我一般不会把它上传到陌生服务。
私有化部署kkFileView,首先改变的是文件流向。
预览服务可以和对象存储、文件服务器、NAS放在同一个内网,由自己的域名、身份认证和访问日志保护。业务系统给它一个受控的文件地址,它在自己的网络边界里完成拉取和转换。
第二个变化是复用。
只要约定统一的预览地址,知识库、OA、合同系统、网盘和项目管理工具都可以调用同一个服务。以后要调整水印、缓存、打印或下载策略,也不必逐个系统修改。
第三个变化是可控。
缓存放在哪里、保留多久、哪些文件来源可以访问、能不能上传、是否允许打印和下载,都能按自己的环境设置。这种可控不是为了“功能更多”,而是为了让预览能力真正进入现有的安全和运维体系。
不过有一点要说清楚:私有化不等于文件原地不动。 对于Office、CAD等需要转换的格式,kkFileView仍可能把源文件拉到预览服务器并生成缓存文件。所以部署位置、缓存目录、清理策略和访问权限,都需要认真规划。
三、先用当前版本跑起来,不要盲目使用旧镜像
截至我写这篇文章时,项目最新发行版是v5.0.2。这个版本修复了不可信HTML预览和演示文件删除接口相关的安全问题,并明确建议v5.0.1及更早版本升级。5.x版本使用源码或发行包运行时,需要JDK21及以上。
这里有个很容易踩的坑:Docker Hub上的官方keking/kkfileview:latest更新时间较早,不应该看到latest就默认它等于GitHub当前发行版。
如果准备验证v5.0.2,我更倾向于从对应Tag自行构建镜像,把版本固定下来:
git clone --branch v5.0.2 --depth 1 \
  https://github.com/kekingcn/kkFileView.git
cd kkFileView
docker build -t kkfileview:5.0.2 .
构建完成后,可以先用一个收紧过的配置启动。下面只是示例,域名和网段要换成自己的真实环境:
docker run -d \
  --name kkfileview \
  --restart unless-stopped \
  -p 8012:8012 \
  -v /srv/kkfileview/data:/data \
  -e KK_FILE_DIR=/data \
  -e KK_TRUST_HOST=files.example.internal \
  -e KK_NOT_TRUST_HOST=localhost,127.0.0.1,169.254.* \
  -e KK_FILE_UPLOAD_DISABLE=true \
  -e KK_BASE_URL=https://preview.example.internal \
  kkfileview:5.0.2
启动后先访问http://服务器地址:8012/确认服务正常,再接入Nginx或现有网关,配置HTTPS、认证和访问日志。
我不建议第一次启动就把KK_TRUST_HOST写成*。那确实省事,却会把预览服务变成一台能够替别人请求任意地址的机器,SSRF风险也会跟着出现。
四、接入业务系统,其实只需要一个预览地址
kkFileView把预览能力统一到了/onlinePreview入口。业务系统拿到文件下载地址后,按项目约定进行Base64和URL编码,再拼到预览服务地址上即可。
前端可以封装成一个很小的函数:
functiontoBase64(value) {
const bytes = newTextEncoder().encode(value);
let binary = "";
  bytes.forEach(byte => binary += String.fromCharCode(byte));
returnbtoa(binary);
}
const fileUrl = "https://files.example.internal/report.docx";
const encoded = encodeURIComponent(toBase64(fileUrl));
window.open(
`https://preview.example.internal/onlinePreview?url=${encoded}`
);
我会把这段逻辑放到统一的前端组件或后端接口里,而不是让每个页面自己拼URL。这样以后预览域名、签名方式或访问参数变化,只需要改一个地方。
还要提醒一句:Base64只是编码,不是加密。它不能隐藏真正的文件地址,更不能代替鉴权。
如果文件本身需要权限控制,更稳妥的做法是给kkFileView一个短时有效的签名地址,或者让预览请求经过业务后端校验后再生成。签名时间不要过长,也不要把永久下载地址直接暴露给前端。
五、它最适合放在哪些地方
我觉得kkFileView最舒服的位置,不是独立当一个“在线转换网站”,而是藏在已有系统后面。
内部知识库和OA
制度、方案、合同、表格可以直接在浏览器里确认内容。用户只有确实需要编辑时才下载,日常浏览会顺很多。
NAS和家庭文件中心
NAS擅长保存文件,却不一定擅长统一预览。把kkFileView接在文件服务前面,可以补上Office、压缩包、CAD和特殊格式的浏览入口。
项目管理和研发平台
需求附件、原型、日志、代码片段、Draw.io和压缩包都能在同一页面预览。少一次下载,就少一次文件散落在个人电脑里的机会。
客户资料和合同系统
业务人员只需要查看内容时,可以直接在系统内打开。配合水印、短时URL和访问日志,比把原文件不断转发到聊天工具里更容易管理。
六、上线前,我会重点检查这六件事
预览服务会接触大量不可信文件,也会主动访问文件地址。它不是普通静态网页,上线时不能只看“页面能不能打开”。
1.固定在v5.0.2或更高安全版本
v5.0.1及更早版本存在已经公开修复的安全问题。不要长期运行来源不明或多年未更新的旧镜像。
2.明确配置文件来源白名单
使用KK_TRUST_HOST只允许对象存储、文件服务器或内部下载域名。黑名单优先级更高,可以阻止环回地址、云元数据地址和不该访问的网段。
如果真实文件服务就在10.*或192.168.*内网,不能简单把整个网段全禁掉。更合理的做法是只放行明确的文件服务地址,并从网络层限制容器能够访问的目标。
3.生产环境关闭演示上传与删除能力
如果只是给业务系统提供预览,不需要开放演示首页的上传和删除功能。功能越少,暴露面越小。确实需要删除接口时,也要按新版要求设置独立强密码,并在网关侧限制调用来源。
4.给转换任务设置资源边界
大PDF、复杂Excel、CAD和视频转码都可能消耗CPU、内存和磁盘。要限制上传大小、转换线程、超时时间,并监控容器重启、磁盘增长和任务积压。
5.把缓存目录当作敏感数据处理
转换后的PDF、图片和解压文件仍然可能包含业务信息。缓存目录需要独立挂载、限制权限、定期清理,备份策略也要考虑是否真的需要保存这些派生文件。
6.不要把“禁止下载”理解成绝对防泄露
隐藏下载按钮、关闭打印、增加水印,都能提高操作门槛,但浏览器既然能展示内容,用户就可能截图、抓取或通过其他方式保存。真正的权限仍然要由业务系统、短时凭证、网络边界和审计共同保证。
七、它也有自己的边界
我推荐kkFileView,但不会把它描述成“装上以后所有文件问题都解决了”。
它更适合预览,不是在线编辑和多人协作平台。复杂Office文档经过LibreOffice转换后,版式也可能和原软件存在差异;特殊字体、宏、动画、超大表格和专业CAD模型,都应该用真实样本验证。
如果只是预览PDF和普通图片,直接使用成熟的前端组件可能更轻。kkFileView的优势,要在文件类型足够杂、系统数量足够多、又确实需要私有化时才会体现出来。
另外,格式支持多也意味着依赖多、镜像大、转换链路长。上线前最好挑出自己最常见的十几份文件做一组回归样本,而不是只用一个简单Word文档判断效果。
写在最后
我喜欢kkFileView的原因,不是它把文件预览做得多炫,而是它把一件到处重复建设的小功能,整理成了一项可以复用的基础能力。
部署一次,多个系统共用;文件留在自己的网络边界里;格式转换、缓存和展示有统一入口。这种工具平时不太抢眼,但真正接进日常系统以后,会悄悄减少很多“下载—打开—关闭—再删除”的无效动作。
如果你的文件类型很多、系统不少,又不愿把内部文件交给第三方网站,kkFileView值得搭一套小环境试试。
可以先从一条内部文件链路开始:固定当前安全版本,只开放一个可信文件域名,再用真实文档检查预览效果和资源消耗。跑通这一小段,比一开始追求“所有格式都支持”更稳妥。
​
项目与参考资料:
  • kkFileView官方GitHub仓库

相关学习资料