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. 文件编辑

协同文件复制与删除

复制和删除是改变石墨侧文件状态的两个"硬动作",做不好会让石墨侧和你的业务库长期不一致 —— 业务列表里点开找不到文件、删除后还能继续协同、复制半截子用户已经在编辑空文档。本文按"先理解石墨的接口语义、再设计业务侧一致性流程"的顺序,把这两件事讲清楚。

一、整体架构#

复制和删除有两个共同的特征:
石墨和你的应用各持一份文件状态。石墨这边有文档内容、协同会话、历史版本;你的应用那边有文件元数据(标题、所有者、业务权限、归档状态)。两边必须在每一次复制 / 删除时同步变更,否则就会长期不一致。
一致性的责任在你的应用侧。石墨接口只保证"我这边的动作成功",业务库的写入、回滚、补偿都由你的应用编排。
业务库写入与石墨 API 调用必须按一定顺序编排,下面两节会具体说明流程。
删除是"全量同步",复制是"任务异步",两个动作的失败处理逻辑也不一样。

二、复制文档#

2.1 接口定义#

POST /sdk/v2/collab-files/{fileId}/copy
Header: X-Shimo-Signature, X-Shimo-Token
Body:   { "fileId": "<新文件 ID>" }
Path 上的 fileId 是源文件 ID,Body 里的 fileId 是新文件 ID,两者不要弄反。
接口是异步任务:首次请求会创建任务并立即返回,状态查询靠"重复请求同一个新 fileId"来轮询。
新 fileId 由你的应用决定(长度不超过 64),同一个新 fileId 重复调用是安全的,落到同一个任务上。
响应的 HTTP / code 列表:
HTTPcode含义业务侧动作
200—首次创建任务成功启动轮询
20070019副本创建中继续轮询,建议指数退避
204—副本创建成功解锁文件、回写业务状态
40070016任务信息找不到视为失败,回滚业务记录
40070017副本任务执行失败视为失败,回滚业务记录
50070015读取源文件出错可重试 1-2 次后视为失败
50070018查询任务状态出错可重试,避免无限轮询
50070020未知任务状态视为失败、记日志

2.2 完整流程#

要点:
业务库先建一条 copy_pending 记录,再调石墨。失败时业务库有明确的中间态可以查、可以补偿,比"成功才插库"更稳。
轮询用同一个新 fileId 反复 POST,不要因为多请求几次而误以为会创建多个副本 —— 接口是幂等的。
副本就绪前的新 fileId 不应该让用户能打开,前端应在业务库 status 为 ready 时才允许进入;否则用户会看到空文档或权限错误。

2.3 cURL 示例#

2.4 与模板功能的关系#

复制接口也是石墨文档模板功能的底层机制:把模板 fileId 作为源、业务实例 fileId 作为目标即可"套用模板"。需要复制后初始化权限、所有者、标题等,应当在 204 之后通过元信息回调改造,而不是塞到复制请求里。

三、删除文档#

3.1 接口定义#

DELETE /sdk/v2/api/files/{fileId}
Header: X-Shimo-Signature, X-Shimo-Token
详见官方接口文档。204 表示删除成功,无响应体。
删除是对石墨侧文档状态的硬约束,调用之后文档内容、协同会话都会失效。
调用前必须做业务侧权限校验。石墨接口本身不会校验"是不是文件所有者"这种业务规则。
删除后,下一次元信息回调应该返回不存在或 readable: false,以让前端编辑器直接拒绝加载(详见协同文档权限模型与回调实现)。
协同 SDK 在文档被删除时会主动断开当前在线协作者的 WebSocket 会话。

3.2 完整流程#

注意:
顺序是"先业务校验 → 中间态落库 + 审计 → 调石墨 → 业务终态"。这样无论中间哪一步抖动,都有明确的状态可以补偿。
审计要在调用石墨之前写。如果调用石墨失败了再补审计,失败的删除请求就丢了痕迹。

3.3 cURL 示例#

四、异常与回滚#

4.1 复制失败#

场景业务侧处理
首次 POST 直接 4xx / 5xx(非任务相关错误码)业务库直接改 copy_failed,不进入轮询
轮询过程中收到 70015 / 70016 / 70017 / 70020业务库改 copy_failed,不要让新 fileId 暴露给用户
轮询超过最大次数仍是 70019视超时阈值告警;可以选择"继续后台轮询 + 前端先提示用户稍后再来"
70015(源文件读取错误)检查源文件是否被删除、或源文件 fileId 是否拼错
永远不要因为复制失败就去删除源文件 —— 异常情况下保留源文件是底线。

4.2 删除失败#

场景业务侧处理
石墨返回非 204业务库保留 deleting,进入补偿队列,不要回滚到 active(避免删了一半又看起来正常)
重复点击删除业务库 deleting / deleted 状态下直接幂等返回,不再二次调用石墨
用户已经在协同调用成功后,石墨会断开其会话;前端编辑器抛错时业务侧记录这次状况即可

4.3 元信息回调与已删除文件#

删除完成后,针对该 fileId 的文件元信息回调有两种合规返回:
1.
HTTP 404:表示文件不存在;编辑器会直接拒绝加载。
2.
HTTP 200 + permissions.readable: false:表示存在但无权访问;编辑器进入"无权"提示界面。
两种返回都可以,区别在于业务侧是否还保留"已删除"软删记录。如果保留就用 2,如果硬删则用 1。

五、常见误区#

误区实际影响正确做法
Path fileId(源)与 Body fileId(目标)弄反复制的是空文档,或撞库到已存在的目标严格区分:Path 是源,Body 是目标
首次 POST 返回 200 后就当成功实际是任务被接受、内容还没复制完等到 204 才算成功
不轮询、直接告诉用户"成功"用户立刻打开拿到空白文档完成轮询、状态置 ready 再开放访问
调用石墨成功才写业务库失败时业务侧没记录、无法补偿业务侧先写 pending,再调石墨,最后落终态
删除时不做业务侧权限校验,依赖石墨石墨不校验业务权限,任何人都能删业务侧先校验 owner / manageable
删除失败时回滚业务库为 active用户以为没删,但其实石墨那边已经删了保留 deleting,进补偿队列
已删除文件的元信息回调仍返回 readable: true用户能继续打开"幽灵文档"返回 404 或 readable: false
不写删除审计,依赖事后查石墨日志出问题时无法追溯责任人和时间业务侧先写审计、再调石墨
修改于 2026-06-22 02:43:30
上一页
协同文件保存与更新机制
下一页
整体概述
Built with