1. 04. 文件编辑
石墨文档中台-开发文档
  • 1. 适用范围
  • 00. 概述
    • 石墨文档中台能做什么?
    • 三种典型的业务接入场景
    • 石墨文档中台支持哪些格式?
  • 01. 快速开始
    • 基本概念
    • 场景一:10 分钟创建预览文件
    • 场景二:10 分钟创建协同编辑文件
  • 02. 鉴权与安全
    • 整体概述
    • 签名凭证 Token
    • 签名凭证 Signature
  • 03. 文件预览
    • 整体概述
    • 如何预热预览缓存
    • 如何防盗链
    • 常见问题处理
  • 04. 文件编辑
    • 整体概述
    • 协同文档权限设计
    • 协同文件保存与更新机制
    • 协同文件复制与删除
  • 05. 文件导入导出
    • 整体概述
    • 常见问题处理
  • 06. 石墨前端 API
    • 整体概述
    • 公共 API
      • 公共处理方法
      • 顶部栏定制 HeaderBars
    • 编辑器 API
      • 轻文档
      • 传统文档
      • 表格
      • 幻灯片
      • 表单
      • 应用表格
  • 07. 石墨后端 API
    • 整体概述
    • 错误码说明
    • 文件-预览 API
      • 访问预览文件
      • 创建文件预览缓存
    • 文件-协同编辑文件管理 API
      • 访问协同编辑文件
      • 创建协同文件
      • 创建协同文件副本
      • 删除协同文件
    • 文件-导入导出 API
      • 文件导入
        • 文件导入说明
        • 创建导入任务
        • 获取导入进度
        • 创建导入任务(旧版)
        • 获取导入进度(旧版)
      • 文件导出
        • 文件导出流程
        • 创建导出任务
        • 获取导出进度
    • 文件-表格文件(Excel) API
      • 表格接口参数说明
      • 获取表格内容
      • 获取表格中的评论数
      • 更新表格内容
      • 追加表格内容
      • 删除表格行
      • 新增表格工作表
    • 文件-文稿文件(Word) API
      • 文稿书签说明
      • 读取文稿书签内容
      • 替换文稿书签内容
    • 文件-文档文件(类 Markdown) API
      • 获取文档中的评论列表
    • 文件-应用表格文件(多维表格)API
      • 应用表格列及单元格值结构
      • 应用表格接口调用规则
      • 获取数据表列表
      • 创建数据表
      • 获取字段列表
      • 创建字段
      • 更新字段
      • 删除字段
      • 新增行
      • 获取单行
      • 更新行
      • 删除行
    • 文件-获取额外信息 API
      • 获取文件的纯文本内容
      • 文件纯文本字数统计
      • 获取文件的历史列表
      • 获取文件的版本列表
      • 获取文件内容中所有的 @ 人信息列表
      • 还原文件历史版本
    • 系统管理 API
      • 应用管理
        • 获取应用详情
        • 更新应用回调地址
      • 用户席位管理
        • 用户席位状态说明
        • 获取用户列表和席位状态
        • 激活用户席位​
        • 取消用户席位​
        • 批量设置用户席位
    • 其他 API
      • 上报事件
      • 创建行为历史
      • 推送文件内全部的用户
      • 推送用户全部的 websocket 连接
    • 获取行列表
  • 08. 回调接口(你的应用需实现的接口)
    • 整体概述
    • 文件信息
      • 文件权限说明
      • [重要] 获取文件元信息-协同文档
      • [重要] 获取文件元信息-预览文档
      • 获取当前用户的文件列表
      • 获取文件的协作者列表
      • 获取接入方指定文件的完整访问地址
      • 获取文件元信息-协同文档自动任务(admin)
      • 根据指定用户获取文件元信息-协同文档(admin)
    • 用户信息
      • 批量获取用户信息(admin)
      • [重要] 获取当前用户信息
      • 获取当前用户所在团队信息
      • 获取指定用户信息
      • 获取用户水印信息
      • 获取用户部门路径
      • 批量获取用户信息
    • 团队和部门
      • 特殊部门 ID 说明
      • 获取团队下的成员列表
      • 获取部门信息
      • 获取部门的下级部门节点
      • 获取部门下的成员分页列表
    • 搜索功能
      • 获取与文件相关的用户列表
      • 获取与文件相关的文件列表
      • 按关键字搜索文件和用户列表
    • 事件推送
      • 整体概述
      • 评论(Comment)
        • 轻文档
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 表格
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 传统文档
          • 对于评论的回复评论
          • 添加评论
          • 更新评论
          • 删除评论
        • 幻灯片
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 应用表格
          • 添加评论
          • 对于评论的回复评论
          • 删除评论
      • 讨论(Discussion)
        • 轻文档
          • 发送讨论消息
      • 提及(MentionAt @ 人)
        • 轻文档
          • 在评论中 at
          • 在讨论中 at
          • 在正文中 at
        • 表格
          • 在评论中 at
          • 在正文中 at
        • 传统文档
          • 在评论中 at
          • 在正文中 at
        • 应用表格
          • 在评论中 at
          • 在正文中 at
      • 日期提醒 (DateMention)
        • 轻文档
          • 创建
          • 修改
          • 删除
        • 表格
          • 创建
          • 修改
          • 删除
        • 传统文档
          • 创建
          • 修改
          • 删除
      • 文件内容更新 (FileContent)
        • 文件内容更新
      • 文档协作者协同状态变化 (Collaborator)
        • 文档协作者协同状态变化
      • 文件版本 (Revision)
        • 版本
      • 系统事件 (System)
        • 系统事件
      • 回调请求错误(实验性)
        • 回调请求错误
  • 09. 核心模型
    • 你的应用如何设计应用(app)模型?
    • 你的应用如何设计文件数据模型?
    • 你的应用如何设计通讯录模型?
    • 你的应用系统如何设计文件权限模型?
  • 10. 典型场景方案
    • 云盘场景
    • IM 场景
    • 示例代码仓库
  • 11. 常见问题
    • 访问接口提示 Signature
    • 文件预览或导入报错
    • 首次接入 SDK 报错
    • 文档预览如何做防盗链
    • 复制粘贴、全屏操作不正常
    • 如何实现文档模板功能
    • 文档内容何时保存
    • 移动端不支持 blob 协议导致预览失败
    • 如何实现文件重命名
    • 如何通过接口修改文档内容
    • @人员时如何直接跳转至对应锚点
  1. 04. 文件编辑

整体概述

业务系统里点击"新建 / 编辑文档",到石墨编辑器在 iframe 里完整加载出来,中间会经过四个角色(用户、你的应用前端、你的应用后端、石墨文档中台)和若干次回调。本文把这条完整链路一次性讲清楚,给你的应用做集成时的"主线参照"。

一、整体架构#

整个协同编辑接入跨越三个网络区域:用户、你的应用、石墨文档中台。三者之间只有特定的几条通信路径,箭头方向就是请求发起方向。
注意:
你的应用需要至少实现(/users/current/info 和 /files/{fileId})这两个回调接口。
你的应用后端也需要能访问石墨文档中台接口。
你的应用前端 SPA、业务后端、石墨 iframe 需要支持用户浏览器访问。
这张图和下文第二节的时序图是同一件事的两种画法 —— 这里强调"经过哪些组件",第二节强调"按时间发生的顺序"。

二、 你的应用和石墨文档中台业务边界#

协同编辑接入解决的是这样一件事:业务系统继续管文件入口、用户身份、业务权限;石墨提供编辑器、协同保存、评论、版本等文档能力。两边的边界很清晰:
你的应用负责石墨负责
文件 fileId 的生成与持久化编辑器 UI 与协同引擎
用户身份(当前用户回调)多人协同冲突合并
业务权限(元信息回调返回的 permissions)自动保存、历史版本、评论、@提醒
短期 signature 与 token 的签发文档导出、模板等增值能力
前端 iframe 容器、JSSDK 初始化iframe 内的全部交互
用图来表达就是这样:左半边的盒子是你的应用需要自己实现的,右半边是石墨已经提供的能力,中间三条线是两边交互的方式。

三、完整时序图#

下图覆盖了"新建一个协同文档并打开"的全流程;如果是"打开已有文档",第 4 步可以跳过。
下面按时序图的 5 个阶段逐步拆解。

3.1. 阶段 ①:业务后端准备 fileId 与凭证#

fileId 由你的应用完全自决,要求是全局唯一且稳定。推荐做法:
普通业务文档:直接用业务系统的文档主键,例如 38291。或者使用 uuid 算法生成。
与预览共用 ID 的场景:注意预览缓存策略,详见预热预览缓存指南。
后端在这一步要落库的至少包括:
字段用途
fileId全链路串联标识
name文档标题,回调时返回
typedocument / documentPro / spreadsheet / presentation / table / form
创建者 ID获取文件元信息-协同文档 回调接口返回,参与权限判断
业务权限决定回调里 permissions 各字段如何返回
凭证部分会在阶段 ③ 详细讲;这里前端拿到的就是 fileId + signature + token 三件套。

3.2.阶段 ②:创建新文件#

POST /sdk/v2/api/files 用于在石墨侧"登记"一个新的协同文档。只有新建时调用,打开已存在的文档不需要重复调用。
type 取值参考官方接口文档:
值含义
document轻文档
documentPro传统文档(接近 Word)
spreadsheet表格
presentation幻灯片
table应用表格
form表单
成功响应是 HTTP 204 空响应体,幂等不严格保证 —— 业务侧需要确保同一个 fileId 不会被重复创建(推荐用数据库唯一索引或"创建前先查")。

3.3.阶段 ③:签发 signature 和 token#

这两个凭证职责完全不同,容易混。
signature:用 App ID + App Secret 生成的 JWT,石墨用它验证你的应用身份。结构:
// Header
{ "alg": "HS256", "typ": "JWT", "kid": "YOUR_APP_ID" }

// Payload
{ "exp": 1716800000 }   // 秒级时间戳,过期时间
Java 示例(官方文档中有完整代码):
token:由你的应用自定义、自解析;你的应用用它识别"这次请求是哪个用户发起的"。石墨拿到后原封不动放到回调请求的 X-Shimo-Token Header 里转回来。
格式不限,推荐方案(详见官方 Token 文档):
方案安全性适用
JSON 明文(含 uid)低仅开发 / 测试
JWT 签名(推荐)中高生产环境主力方案,注意 secret 与 signature 的不同
AES-256-GCM 加密高合规要求严苛的场景
Token 里必须包含足够定位用户的信息(最常用是 uid),其它字段可以作为"透传载荷"使用,例如 traceId 用来串联日志。
两个凭证都建议短期、按需签发:每次前端打开编辑器都向后端要一次,不要在前端长期缓存。
下图把两者的流向并排放在一起 —— signature 在石墨那一侧被消费、不再外传;token 则会被石墨原封不动转给你的应用自己的回调接口。
记忆口诀:signature 给石墨看,token 给自己看。

3.4. 阶段 ④:石墨回调你的接口#

前端 connect 后,石墨文档中台会先回调你应用的接口获取必要的数据。这两个接口你的应用必须实现并对石墨服务端可达,否则编辑器加载会直接失败。

回调 [获取当前用户] 接口#

GET {endpoint_url}/users/current/info
Header: X-Shimo-Token: <前端传入的 token>
你的应用根据 token 解出用户 ID,返回:
{
  "id": "userid123",
  "name": "张三",
  "avatar": "https://example.com/user-123.png",
  "email": "user123@example.com",
  "teamGuid": "123"
}

回调 [获取文件信息(协同)] 接口#

GET {endpoint_url}/files/{fileId}
Header: X-Shimo-Token: <前端传入的 token>
你的应用根据 token(识别用户)+ fileId 查业务库,返回:
{
  "id": "doc_38291",
  "name": "Q3 战略规划",
  "type": "documentPro",
  "permissions": {
    "readable": true,
    "editable": true,
    "commentable": true,
    "copyable": true,
    "exportable": true,
    "manageable": false
  },
  "creatorId": "userid123",
  "createdAt": "2026-04-01T08:00:00Z",
  "updatedAt": "2026-04-02T09:30:00Z",
  "teamGuid": "123"
}
关于 permissions 字段的几个要点:
editable: true 时 copyable 必须为 true。
文档创建者建议给 manageable: true,影响删除、版本管理、表格锁定等行为,详见 获取文件元信息-协同文档。
协同文档的元信息回调和预览文档共用同一个 URL,需要按 type 字段区分返回逻辑(type: file 走预览分支,其它走协同分支)。

四、新建协同文件 vs 打开已有协同文件#

两条路径只在第 ② 步有差异,其余完全一致。拆成两个独立流程看会更清楚:
新建协同文件
打开已有协同文件
修改于 2026-06-22 02:43:30
上一页
常见问题处理
下一页
协同文档权限设计
Built with