
在集成OnlyOffice DocumentServer的过程中,很多开发者都会遇到两个非常典型的问题:
很多人会认为:
但实际上:90% 以上的问题,都与 document.key 的机制理解错误有关。
本文将结合:
完整讲清楚:ONLYOFFICE 的文档生命周期到底是如何运行的,以及企业系统应该如何正确设计。
很多开发者第一次接触 ONLYOFFICE 时,会认为:浏览器 ⇄ example.docx
即:浏览器直接在线编辑服务器上的 Word 文件。实际上并不是。ONLYOFFICE 的真实流程是:
example.docx
↓
DocumentServer 下载文件
↓
转换为内部中间格式(Editor.bin)
↓
浏览器加载 Editor.bin
↓
多人协同编辑的是 Editor.bin
也就是说:浏览器真正编辑的是 ONLYOFFICE 内部缓存中的协同编辑文件。而不是原始 Word 文件。
很多人把:document.key 简单理解成:文件ID。这是错误的。正确理解document.key 的本质是:当前文档内容版本的唯一身份标识。它不是文件ID,而是:当前协同编辑版本ID
document.key 决定了:
作用 | 说明 |
|---|---|
协同编辑 | 是否进入同一个协同会话 |
缓存命中 | 是否复用已有 Editor.bin |
文件更新判断 | 是否认为文件已经变化 |
文档重新加载 | 是否重新下载原始文件 |
历史版本关联 | 是否属于同一个编辑版本 |
理解下面这个流程后,很多问题会瞬间清晰。
例如:document.key = key0,对应:文档版本 v0
此时:
缓存目录通常位于:/var/lib/onlyoffice/documentserver/App_Data
多个终端:使用同一个 key0。则:会进入同一个协同编辑会话。此时大家编辑的是:Editor.bin
而不是原始 Word 文件。callback 会收到:status = 1。表示:有人开始协同编辑。
此时:
这是很多系统第一次踩坑的地方。开发者误以为:用户点击保存 = 文件已经更新。实际上:并没有
ONLYOFFICE 会在:
之后:真正生成新的 output.docx。
例如:
key0_123456/
├── changes.zip
└── output.docx
然后 callback:status = 2。或者:status = 6。此时:output.docx 才是真正的新版本文件。
这是企业系统最经典的问题。
错误做法
很多系统收到 callback 后没有下载 output.docx。仍然保留旧的原始文件。
结果
下一次重新打开ONLYOFFICE 下载的仍然是旧文件。于是用户看到:“刚才编辑的内容没了”。实际上不是内容丢失。而是你根本没有保存新的 output.docx。
收到 status = 2或status = 6后必须执行以下步骤。
例如:"url": "http://xxx/output.docx"
output.docx
↓
原始 Word 文件例如:v0 → v1
例如:key0 → key1
本质原因:ONLYOFFICE 内部记录的版本,与实际文件内容不一致。
例如:
ONLYOFFICE 会认为:key0 对应的应该还是旧内容。于是:出现版本冲突提示。
例如:
ONLYOFFICE 会认为:这是一个全新文档。
导致:
例如:
用户A:key0
用户B:key1
ONLYOFFICE 会认为:这是两个不同文档。结果:无法协同编辑。
核心原则只有一句:
内容不变 → key 不变
内容变化 → key 必须变化
这是整个 ONLYOFFICE 集成最核心的规则。
推荐:
documentId + version
例如:
contract_1001_v27
或者:
tenantA_doc1001_v27
这是最稳定、最容易排查问题的方案。
建议维护:
字段 | 说明 |
|---|---|
document_id | 文档ID |
version | 文档版本号 |
file_path | 文件路径 |
last_modify_time | 更新时间 |
打开文档时:
key = documentId + "_v" + version
例如:
key = "1001_v27"
读取数据库:
version = 27
生成:
key = 1001_v27
ONLYOFFICE 内部维护:
Editor.bin
服务端:
例如:
27 → 28
生成:
key = 1001_v28
ONLYOFFICE 会认为:这是新的内容版本。整个流程完全正确。
因为:callback 是异步的。ONLYOFFICE 并不是:关闭页面 → 立即生成 output.docx。而是:
0~几秒后才真正生成。因此如果系统存在如下情况,都可能导致文件内容 与 key 不一致,于是出现“版本已更新”。
错误 1:key 永远等于 documentId
例如:
key = documentId
后果:文件更新后仍使用旧缓存。
错误 2:每次随机 UUID
例如:
key = UUID.randomUUID()
后果:
错误 3:callback 不保存 output.docx
后果:用户再次打开看到旧文件。
ONLYOFFICE 本质上是:“基于 key 的协同编辑缓存系统”。它并不是:直接在线编辑 Word 文件
而是:
Word 文件
↓
Editor.bin
↓
多人协同
↓
生成 output.docx
而document.key就是当前协同编辑内容版本的唯一身份标识。
企业系统中document.key 一定不要简单使用 documentId。正确做法:documentId + version,同时收到 callback 后必须:
只要严格遵循这一机制:
这也是 ONLYOFFICE 企业级集成中最核心的一条原则。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。