
附件预览这件小事,为什么总做不利索
做过企业内部系统的都有体会:OA 里同事传了一份 docx 方案,工单系统里客户回了一封带 msg 附件的邮件,工程部甩上来一张 DWG 图纸——业务系统一律只会两个动作:下载,或者用浏览器自带的「能不能打开看运气」。想在线看,要么给每台电脑装齐 Office 和一堆专用软件,要么把文件传给第三方转换服务。前者运维成本高,后者在涉密内网和有合规要求的公司里直接被一票否决:文件出了内网,谁敢保证不下落不明?
服务器端方案也有,比如老牌开源的 kkFileView,背后要跑一套 Java 服务加 LibreOffice 做转码,机器配置、并发、字体全是运维负担。而最近在开发者社区里被反复讨论的 File Viewer 走了另一条路:把解析和渲染整个搬进浏览器,不架转码服务,文件从头到尾不离开访问者的电脑。今天这篇文章就把它讲透:项目背景、与 kkFileView 的选型对比、三种接入姿势、五个真实的坑,以及内网离线私有化部署的完整做法。
项目档案:先把关键事实摆清楚
| 项目 | 说明 |
|---|---|
| 名称 | File Viewer(Flyfish File Viewer) |
| 仓库 | github.com/flyfish-dev/file-viewer |
| 官网 / 文档 / Demo | file-viewer.app / doc.file-viewer.app / demo.file-viewer.app |
| 开源协议 | Apache-2.0(另有商业版:高保真 Office 引擎 + 企业支持) |
| 架构形态 | 纯前端组件生态,浏览器内解析渲染,无需服务端转码 |
| 格式覆盖 | 275 个已注册扩展名(225 稳定 + 50 实验)、47 条预览链路 |
| 框架支持 | Vanilla JS / Web Component / Vue 2.6~3 / React 16.8~19 / Svelte / jQuery / Flutter(开发预览) |
| npm 生态 | 约 89 个发布包:core 底座 + 20 余个 renderer + 5 类 preset + 8 个框架组件 |
| 部署方式 | npm 接入 / script 标签 IIFE / iframe 零依赖嵌入 / Docker 体验镜像 |
| 写作时版本 | npm 3.3.x(以官方实时为准) |
一句话概括它的定位:面向企业后台、内网和私有化系统的纯前端文件预览组件。它不是一个文件服务器,而是一块可以塞进任何业务系统的「预览面板」——文件服务器该是谁还是谁(Windows 文件服务器、NAS、对象存储都行,搭法可以参考之前那篇 Windows Server 2025 文件服务器搭建详细教程),File Viewer 只负责把取回来的字节在浏览器里还原成可读的画面。
视频里说的「274 种格式」,到底是多少
抖音视频里的口径是 274 种,官方格式事实源 ecosystem/format-catalog.json 目前注册的是 275 个不重复扩展名,其中 225 个稳定、50 个显式按需的实验项,映射到 47 条预览链路。数字差一两个不重要,重要的是覆盖面确实夸张:
| 类别 | 代表格式 |
|---|---|
| 办公文档 | docx / doc / rtf / odt / xlsx / xls / csv / ppt / pptx / odp,连 Apple iWork(pages / numbers / key)、WordPerfect、韩文 HWP 都有 |
| 版式文件 | pdf、国产 OFD 电子发票、Typst 排版源文件 |
| 工程制图 | dwg / dxf / dwf / xps(LibreDWG WASM 解析)、step / iges / stl / glb 等 3D 模型 |
| 压缩包 | zip / 7z / rar / tar / iso / apk 等 30 余种,可浏览目录、点开内部文件继续预览 |
| 邮件与笔记 | eml / msg / mbox、xmind 脑图、drawio / mermaid / plantuml 图表 |
| 代码文本 | 上百种代码与配置格式高亮,超大文件自动切虚拟渲染 |
| 设计文件 | psd / ai / eps / indml / xd(显式安装 renderer-design) |
| 冷门硬货 | dcm 医学影像、p7m / pgp 签名容器、exe / elf 二进制十六进制检查器、chm 老帮助文档、epub 电子书 |
当然,官方自己也不回避短板:注册不代表高还原,复杂 Office 文档的还原度和原生 Office 有差距,上线前要拿自己的业务文件实测。这个「不虚标」的态度在开源项目里算难得的。
和 kkFileView 怎么选:架构决定了上限
评论区里出现频率最高的对比对象就是 kkFileView,两者其实是两条技术路线:
| 对比项 | kkFileView | File Viewer |
|---|---|---|
| 转码位置 | 服务端(Java + LibreOffice) | 浏览器(JS + Worker + WASM) |
| 后端依赖 | 必须部署一套 Java 服务 | 无,静态资源即可 |
| 格式数量 | 70+ 常见类型 | 275 个扩展名 / 47 条链路 |
| 文件流向 | 文件上传到预览服务器再转码 | 字节流进浏览器本地解析,不出域 |
| 并发压力 | 转码吃服务器 CPU,高并发要扩容 | 压力在访问者自己的电脑上 |
| 还原度 | Office 转码链路成熟,整体较稳 | 常规文档可用,复杂排版有差距 |
| 适合场景 | 公网分享、格式杂但对保真要求一般 | 内网系统、涉密环境、SaaS 附件中心 |
🔧 我整理的软件库
这些年折腾服务器、虚拟化和开发环境,装过的系统镜像、运维工具、开发套件、数据库与中间件,我都归档在自建的文件库里,持续补充新版本。没有弹窗广告,不强制注册,需要什么直接取。
常用工具随手可取 · 不定期补档
我的建议很直接:涉密内网、合规敏感、不想再养一套 Java 转码服务的,File Viewer 明显更合适;已经稳定跑着 kkFileView、转换效果满意的,也没必要为换而换。这种「数据不出域」的思路其实和之前写过的开源决策模型 Laya 一脉相承——企业私有化场景里,数据不出域正在从加分项变成门槛项。
三种接入姿势:从零依赖到组件化
姿势一:script 标签 + Web Component(不碰构建工具)
把 @file-viewer/web-full 的完整 dist/ 目录部署到站点,然后一行标签搞定,适合传统后端模板项目:
<script src="/file-viewer/dist/flyfish-file-viewer-web-full.iife.js"></script>
<flyfish-file-viewer
src="/files/report.docx"
theme="light"
style="display:block;height:720px">
</flyfish-file-viewer>
姿势二:npm 组件 + preset(前端工程推荐)
Vue3 项目装一个 full 包就够了,它已内置常用格式矩阵:
npm i @file-viewer/vue3-full
import { createApp } from 'vue'
import FileViewer from '@file-viewer/vue3-full'
createApp(App).use(FileViewer).mount('#app')
<file-viewer url="/files/report.docx" />
想精确控制体积就改用「组件 + preset」组合,比如只要办公文档就 @file-viewer/vue3 + @file-viewer/preset-office,五类 preset(lite / standard / office / engineering / all)按需挑。
姿势三:iframe 零依赖(业务项目一行代码都不装)
从 GitHub Release 下载官方 iframe 交付包解压到静态目录,父页面直接嵌:
<iframe src="/file-viewer/iframe.html?url=/files/report.docx"
style="width:100%;height:720px;border:0"></iframe>
接口返回二进制流的场景,父页面 fetch 到 Blob 后 postMessage 进 iframe 即可预览,连 URL 都不用暴露。新项目还可以用官方 CLI 一键生成示例:npm create file-viewer@latest my-viewer。
框架全家桶:Vue、React、Svelte、jQuery 都有原生包
这是它比多数同类项目厚道的地方:不是只给 Vue 写个包装,而是每个生态都有原生组件,参数、事件、controller 体验保持一致:
| 你的项目 | 推荐安装 |
|---|---|
| Vue 3 | @file-viewer/vue3-full(或 vue3 + preset) |
| Vue 2.7 / 2.6 老项目 | @file-viewer/vue2.7-full / vue2.6-full,老 webpack 项目有专门示例 |
| React 18 / 19 | @file-viewer/react-full,提供 useFileViewer() 自定义工具栏 |
| React 16.8 / 17 | @file-viewer/react-legacy-full |
| Svelte | @file-viewer/svelte-full |
| jQuery 传统后台 | @file-viewer/jquery-full,$('#viewer').fileViewer({url}) 即用 |
| 无框架 / script 标签 | @file-viewer/web-full(IIFE 自托管) |
| 移动端 | Flutter SDK(pub.dev 0.1.0-dev.2 开发预览) |
组件层细节也做得比较足:默认 Shadow DOM 样式强隔离,宿主页面的全局 reset 不会污染预览器;搜索、缩放、打印、导出 HTML、下载、水印、生命周期钩子统一走一套 options;文件列表页要批量生成缩略图还有独立的 thumbnail 包。
五个真实的坑,评论区已经有人踩过
看完心动先别急着上,下面这几个坑是官方文档和实际用户反馈里都点名过的:
- 坑一:运行时资产没复制,重型格式全瞎。PDF、Word、CAD、压缩包这些重能力靠 Worker / WASM / 字体资产,默认从部署基址下的
/file-viewer/目录加载。Vite 项目装 vite-plugin 配fileViewerRenderers({ copyAssets: true }),非 Vite 项目跑npx --no-install file-viewer-copy-assets ./public/file-viewer。漏了这步,轻格式能看、重格式报错,非常迷惑人。 - 坑二:跨域 URL 必须配 CORS。预览是浏览器直接去取文件,文件 URL 跨域而文件服务不给 CORS 头,直接拉不到字节。内网系统建议文件域和预览页面同源,省掉一堆麻烦。
- 坑三:Blob 传参要带扩展名。接口回二进制时别把裸 Blob 塞进去,包成带正确文件名的
File对象再传,否则格式识别可能走错链路。 - 坑四:大文件靠浏览器硬扛,有天花板。Excel 走虚拟滚动、超大文本切有界虚拟行、PDF 支持 Range 分片,但普通办公电脑内存就那么大,几百 MB 的图纸和巨型工作簿照样会卡——这是纯前端路线的物理上限,不是调参能根治的。
- 坑五:还原度别按「打印级」要求。有用户实测反馈复杂 Word、Excel「解析得不是非常好」,官方也明确不承诺原生软件级的保真度。预览、初筛、流转没问题;要签字盖章的终稿,还是让用户下载用原生软件打开。
如果拿不准你们系统的接入路线,或者卡在内网资产部署这一步,可以直接找我:微信 / 手机 17712677007,把系统形态和支持的文件类型说清楚,我帮你捋一遍再动手。
内网离线部署:私有化交付的完整做法
全断网环境也能用,思路是「npm 包内网化 + 运行时资产自托管」两步:
- 包内网化:从 GitHub Release 下载对应版本的 tgz(core、组件包、preset、full 包都有),放进项目
vendor/目录或导入企业 npm 镜像,离线安装; - 资产自托管:full 包自带的同版本 CLI 把 Worker / WASM / 字体 / vendor 资产复制到
./public/file-viewer,特殊路径用setDefaultFullAssetBaseUrl('/static/file-viewer/')覆盖; - 先体验再决定:官方提供 Docker 镜像
flyfishdev/file-viewer和在线 Demo,可以拿自己最刁钻的业务文件先跑一遍,看看还原度再拍板。
上线路径建议这样走:先在 Demo 验证核心格式 → 挑 preset 装进测试环境 → 用 precheckFileViewerSource() 做渲染前预检(不加载重型渲染器就能判断格式是否在能力范围)→ 拿真实业务文件批量试 → 最后切生产。
算一笔账:它到底帮你省了什么
站在中小企业 IT 的角度看,这笔账很好算。传统服务端预览方案 = 一台转码服务器(4C8G 起步)+ Java 服务运维 + LibreOffice 字体调优 + 高并发扩容,一年下来服务器和人力都是持续投入;File Viewer 方案 = 静态资源托管在你现有站点上,边际成本几乎为零,访问量涨了也不用给「预览」扩容——压力分散在每个用户的浏览器里。更现实的是合规收益:文件不上传,内网审计压力小一大截。当然,如果你要的是 Word、Excel 的像素级高保真还原和 SLA 级支持,官方也留了商业版(高保真 Office 引擎 + 企业支持)的路,按需选购即可。
工具选型上我一直是那个观点:先用免费开源的把流程跑通,价值验证了再谈付费升级,和之前写 DBX 时的思路一样——25MB 的开源工作台也能管好 100 多种数据库,开源生态里这类「轻量但够用」的好东西越来越多。
写在最后
File Viewer 不是让你少装 Office 的,而是让业务系统少一层「附件只能下载」的尴尬:OA、工单、知识库、网盘、工程资料库,凡是列表后面跟着文件的地方,都值得嵌一个预览面板。行动清单给你列好了:
- 先打开 demo.file-viewer.app 拿自己的真实文件试还原度;
- 按框架选 full 包或「组件 + preset」,Vite 项目记得配资产插件;
- 上线前用 precheck 预检 + 真实文件批量验证,别只看官方样例。
你手上的系统里,哪类附件最需要在线预览?欢迎评论区聊聊。想找文中提到的工具,也可以到我整理的软件库里翻一翻。
✍️ 关于作者
IT 峰哥,互联网技术从业者。日常折腾服务器、虚拟化、数据库与企业级应用,关注开源系统的二次开发与基础设施落地。这里记录的是踩过的坑和验证过跑得通的方案,不是转述文档。
交流:微信 / 手机 17712677007(注明来意,看到会回)
文中方案如有疏漏,欢迎在评论区指正 · 技术问题欢迎交流