发布时间:2026-07-25阅读(1)
大家好,又见面了。
在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览、在线编辑、多人协同编辑等种种能力的诉求。

对于人力不是特别充裕、或者项目投入预期规划不是特别大的公司或者项目而言,通常会选择基于一些开源方案来实现,但是开源组件选择之后,如何将其无缝对接融入到自己的业务系统中并完全支持自身诉求的实现,**不仅要能用、而且要好用,**其实也是一个需要好好思量的问题。
此前在项目中就曾遇到过这么个场景,下面一起分享下具体的架构设计调整演进与最终方案落地策略,以及过程中遇到的一些问题。

在正式开始构建在线的文件管理服务前,首先是分析下需要支持的功能诉求:

对于文件的存储管理,直接采用了公司内部私有云的OSS文件托管服务进行实现,实现起来比较简单。文件在线预览与Office文件在线编辑的能力,则选用相关的开源方案来实现。经过一番对比分析,最终选定了两个开源组件:
选型确定之后,就是如何与现有业务系统进行整合了。因为开源组件往往都是通用逻辑设计的,而业务系统的逻辑又各不相同,所以如何去整合并方便扩展出自己需要的定制化能力,成了下一步摆在眼前需要处理的问题。

为了保证业务系统的稳定,避免业务系统中强耦合文件预览相关的开源模块,同时也为了方便业务层的调用,所以规划构建一个统一的入口代理转接服务,统一由此服务对业务系统提供预览与在线编辑相关能力,对业务层屏蔽掉底层具体的开源方案整合逻辑。这样的好处是,不管预览与编辑服务这边如何调整,甚至后面更换实现方案,都不会影响到业务层的调用逻辑。

系统边界划定,对业务系统整体的接入配合而言就简单了:
预览编辑服务,作为业务系统的边缘代理适配器模块,需要保证提供给左侧业务系统的接口的稳定,而右侧具体对接的开源方案、内部处理逻辑等,则可以随意调整。

OnlyOffice作为一个负责office在线预览的功能组件,其提供了一个JS API方法。具体使用的时候,需要在html页面中引用其提供的JS文件并调用对应API方法将请求参数传递给OnlyOffice进行处理。这些请求参数里面,既含有对文档在线显示相关的一些属性约定,还包含一个重要的参数,也即需要操作的目标Office文件的获取地址url。在OnlyOffice收到请求之后,需要去给定的地址下载目标Office文件,然后内部解析处理之后,按照请求参数的指定信息,渲染展示到界面上。

在实际的系统规划中,为了便于后续版本升级维护,以及避免OnlyOffice强耦合到各个业务系统中,所以不太倾向于让前端界面直接去集成与调用OnlyOffice相关的JS文件。
所以在实施的时候,在服务端的文件预览编辑服务中进行了封装,对外提供服务端API接口,服务端自带一个简单HTML界面(基于SpringBoot Thymeleaf实现),业务请求对应服务端提供的独立html界面,并在界面中完成使用OnlyOffice的JS api请求的操作。
具体步骤说明如下:



这样就实现整体的交互封装,业务可以代码无耦合的方式来直接使用预览能力。具体的office文档在线预览与编辑的能力实现,由开源的OnlyOffice来提供。

具体使用的时候,交互逻辑如下:
看似很复杂的逻辑,但是经过封装之后,对于业务使用而言其实很简单,只要在发送给文件预览服务的请求中,给定一个文件下载地址与文件保存回调地址即可。

前面有提过,采用OnlyOffice来实现office文档的在线协同编辑,关于OnlyOffice在线编辑的原理,其官网给出的介绍如下:

对上述步骤解释如下:

也即当用户关闭文档编辑界面之后,会触发文档的保存事件,回调callback接口,将保存事件推送给服务端,并告知服务端变更后的文档地址,这样服务端可以从给定的地址下载变更后的文档,然后更新到自己的存储中。
结合到我们具体的项目使用中,其具体的交互过程展开阐述下,就是下图的过程:

这里,一个在线编辑操作的回调请求内容示例如下:
{ "actions": [{"type": 0, "userid": "78e1e841"}], "changesurl": "https://documentserver/url-to-changes.zip", "history": { "changes": changes, "serverVersion": serverVersion }, "filetype": "docx", "key": "Khirz6zTPdfd7", "status": 2, "url": "https://documentserver/url-to-edited-document.docx", "users": ["6d5a81d0"]}
关于回调请求的各个参数的具体含义,可以参见官网介绍,需要特别关注的几个字段梳理如下:
上一篇:美睫怎么去卸掉
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图