1. 05. 文件导入导出
石墨文档中台-开发文档
  • 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. 05. 文件导入导出

常见问题处理

一、排查路线#

如果在导出文件过程中遇到了问题,可以先参考如下流程确认问题出现在哪个阶段,然后再去对应章节寻找解决方法:
排查前可以采集"事发任务"的如下关键字段:taskId、fileId、目标 type、源文件大小 / URL、status、message、最近一次 progress、首次创建时间等,以方便后续问题定位。

二、创建任务阶段#

2.1 创建任务返回 status != 0#

现象 调用 /v2/import 或 /export/{fileId},HTTP 200,但响应 status 不是 0,data 是 null。
原因 任务根本没有被创建。常见来源:参数错(type 不在支持列表里)、签名 / token 失效、fileId 已存在且关联了别的协同文件、源文件无法访问。
排查
1.
先看 message:石墨在这里通常会给出可读的原因。
2.
核对 type 是否在指南的"导入 / 导出支持格式表"内。
3.
核对 X-Shimo-Signature 与 X-Shimo-Token 是否仍在有效期内,时钟是否同步。
4.
导入场景:在你的应用服务器侧用 curl -I "${fileUrl}" 验证石墨能否拉到源文件。
修复 按 message 处理对应一项,并在业务库里把这条记录直接打 failed,不要进入轮询。重试前换一个新的 fileId,不要复用。

2.2 fileId 冲突#

现象 创建导入任务时 status != 0,message 提示文件已存在或类型不匹配。
原因 同一个 fileId 已经关联到某个石墨协同文件(可能是上次半成功的导入,也可能被另外的业务流程用过)。石墨不支持对已存在的 fileId 做覆盖式导入。
排查 在你的应用业务库里搜这个 fileId,看它是不是上一次失败任务残留的 importing 记录。
修复
如果是残留的 importing:标记为 abandoned,重新生成 fileId 再发起导入。
如果是真重复:业务侧逻辑出错,应该在调石墨前就拦截。
预防 业务侧生成 fileId 用 UUID / Snowflake 这类全局唯一方案;不要把"原始文件名"或"用户 ID + 时间戳秒级"作为 fileId。

2.3 fileUrl 拉取失败#

现象 创建任务 status != 0,message 指向下载错误;或任务接受了但轮询很快变成失败。
原因 石墨服务端访问不到你给的 fileUrl:内网地址、未签名的对象存储私链、CDN 防盗链拦截、源文件已被删除等。
排查
1.
用 curl -I "${fileUrl}" 模拟石墨服务端拉取,看 HTTP 状态码。
2.
如果用了对象存储,确认链接是不是"预签名 URL"且签名未过期。
3.
看看是不是 CDN 加了 Referer / IP 白名单导致石墨被拦。
修复 生成"长有效期 + 公网可达"的下载链接(通常对象存储预签名 URL 给 ≥30 分钟就够石墨拉一次)。建议把源文件先转存到一个石墨可达的中转存储再调接口。

2.4 上传了 0kb 文件#

现象 创建任务直接返回 status != 0。石墨文档明确写了"不支持导入 0kb 文件"。
原因 用户上传时网络中断、前端代码先建空文件再写入但写入失败、源文件被截断等。
修复 在你的应用前端 / 后端生成 fileUrl 之前先校验文件大小 > 0;前端展示"文件为空"提示,不要把空文件传到石墨。

2.5 不支持的导出格式#

现象 status != 0,message 提示文件类型不支持。
原因 例如把 .rtf 走 document 通道、把 .numbers 走 spreadsheet 通道。
修复 严格对照支持格式表,业务侧在用户上传时就用扩展名 + MIME 双重校验。需要支持的扩展名应通过白名单而非黑名单方式维护。

三、轮询与超时#

3.1 创建任务返回 status: 0 就当成功#

现象 用户在导入完成提示出现后立刻打开文件,看到空白;或导出后用户点击下载,链接根本不存在。
原因 /v2/import 与 /export/{fileId} 是任务创建接口,status: 0 只代表"任务被石墨接收",文件还在转换中。
修复 任何"任务已接收"的响应都必须接上轮询;只有进度接口返回 progress == 100 才算业务上的成功。前端展示一定要分"导入中 / 导入成功"两态,不要合并。

3.2 不轮询直接放用户进编辑器#

现象 用户点开新 fileId,看到空文档或编辑器报"文件不存在 / 权限错误"。
原因 导入任务还没完成时,新 fileId 在石墨侧还没有内容;如果你的应用前端立刻打开它,编辑器要么拿到空内容、要么连协同会话都建不起来。
修复 业务侧严格按"importing → 轮询完成 → ready"切换状态,前端只在 ready 才允许进入编辑器;中间态展示"导入中"占位页。

3.3 轮询间隔太短#

现象 进度接口短时间内被打了几百次,任务服务返回 429 / 5xx,或被治理系统限流。
原因 误把"轮询"理解成"高频探测"。文件转换是 CPU / IO 密集任务,轮询间隔再小也不会更快完成。
修复 间隔 ≥ 3 秒,并采用指数退避(如 3s → 5s → 8s → 13s …,上限 30s);任务长跑场景由后端定时器统一轮询,前端通过 WebSocket / SSE / 定时拉业务库接收推送,而不是前端自己 1 秒打一次。

3.4 任务超过 10 分钟仍未完成#

现象 进度 progress 在 70-90 区间晃悠,过了 10 分钟还没到 100。
原因 石墨任务最长执行时间是 10 分钟,超过会被服务端终止,但终止的标志可能延后反馈。
修复 业务侧自己设总超时(建议导入 ≤15 分钟 / 导出 ≤30 分钟),超过即视为失败,停止轮询并落 failed。重试时新建任务而不是继续轮询旧 taskId。

3.5 进度长时间停滞#

现象 progress 卡在某个值(例如 35),持续 30 分钟以上不变。
原因 石墨官方明确:导出进度 ≥30 分钟未更新即可认为失败。导入虽然没有同等说明,但行为类似——通常是文件特别大、特别复杂或源拉取卡住。
修复 在轮询逻辑里加"上次进度变化时间"判断,超过阈值视为失败。提示用户"文件可能过大或损坏,请精简后重试"。

3.6 网络抖动 / 5xx#

现象 轮询过程中偶发 502 / 503 / 504 或连接重置。
原因 网关 / 中间代理抖动,并非任务真的失败。
修复 进度查询接口可重试 1–3 次(指数退避)。不要因为一次 5xx 就把任务标 failed;也不要因为重试就新建任务(创建任务接口幂等性弱,会产生新 taskId)。

四、导出下载阶段#

4.1 downloadUrl 已过期#

现象 进度接口拿到 downloadUrl,业务侧晚了几分钟才去下载,结果 403 / 404。
原因 石墨返回的 downloadUrl 是临时签名链接,有效期仅 5 分钟。
修复 拿到 downloadUrl 后立刻消费——后端在同一次轮询完成的处理函数里下载并转存到自己的对象存储。如果一定要延后下载,需要在 5 分钟内重新调进度接口(同一个 taskId 仍有效)拿新的 URL,而不是把旧 URL 再用一次。

4.2 把 downloadUrl 直接返回前端#

现象 用户在导出完成几分钟后点下载链接,浏览器报 403。
原因 同上:5 分钟有效期 + 无防盗链。前端持有时间往往超过 5 分钟(用户去开会、切换窗口、转发给别人等场景太常见)。
修复
后端拿到 downloadUrl 后立刻下载文件流,转存到自己的对象存储(OSS / S3 / COS …)。
前端只看到你的对象存储的链接(自己可控的有效期、防盗链、审计)。
如果需要"按需下载",前端访问你的应用一个稳定接口,由后端按需重取 downloadUrl 并代理流给前端。

4.3 没有重复下载机制#

现象 用户重新刷新页面想再次下载,找不到链接。
原因 业务侧只把 downloadUrl 留在内存或前端 state,没落到自己的对象存储。
修复 把"转存对象存储"做成导出完成的强制收尾步骤,业务库存储路径而不是石墨的临时 URL;前端"下载"按钮始终指向你的对象存储路径。

五、业务一致性与幂等#

5.1 把 taskId 当业务幂等键#

现象 用户重复点了 3 次导出按钮,业务库里出现 3 个不同的 taskId、3 份导出文件。
原因 taskId 由石墨生成,每次调用创建接口都会得到新值。用它做去重,永远去不掉。
修复 业务侧自己维护一个去重键(如 fileId + type + 触发时间窗),在调石墨之前先查表:
如果窗口内已经有 exporting / ready 的同键任务,直接返回那个 taskId 给用户。
没有再调石墨创建新任务。

5.2 用户重复点击导入 / 导出#

现象 短时间内同一个用户对同一个文件触发了多次导入或导出请求。
原因 前端没做按钮 disabled、网络慢用户多点了几下、前端组件状态丢失。
修复
前端:点击后立即 disabled,并在收到后端响应后再恢复。
后端:基于 D.1 的去重键拦截,幂等返回当前任务的 taskId 与状态。

5.3 失败时业务库未回滚 / 未落终态#

现象 业务库里堆积了一批永远停在 importing 或 exporting 的记录,用户列表里看到"导入中"几十分钟没动静。
原因 任务失败后只在日志里记了一行,没把业务库改成 failed;或者代码里只处理了"成功"分支,"失败"路径漏写。
修复
轮询循环必须保证退出时总有一次终态写库(ready 或 failed)。
加补偿任务:定时扫描"创建 > N 分钟仍在 importing / exporting"的记录,按 B.4 / B.5 的逻辑判定失败。

5.4 失败时没保留 taskId#

现象 用户报"刚才导入失败了,能查下原因吗",业务侧只有一句"任务失败",没法回查石墨日志。
原因 失败分支只写了人类可读的 message,没把 taskId / fileId / type / fileUrl / 时间 这些定位字段一起持久化。
修复 失败日志至少包含:taskId / fileId / 目标 type / 源文件大小 / 源文件 URL(脱敏)/ 最近一次 status & message / 重试次数 / 时间戳。这套字段也方便你在排查时拿去找石墨支持。

六、上线检查清单#

检查项验证方式
轮询有总超时模拟一个永不完成的任务,确认 N 分钟后业务侧自动落 failed
轮询间隔 ≥ 3s 且指数退避抓包看一次完整轮询的间隔序列
downloadUrl 在 5 分钟内被消费看导出日志,从拿到 URL 到下载完成的时间戳差 < 5min
导出文件落到自家对象存储业务库存的是对象存储路径,不是石墨临时 URL
业务侧幂等键去重连续点 3 次同样的导出按钮,最终只产生 1 个有效任务
0kb / 不支持格式 / 过大文件被前端拦截用极端样本走一遍流程
失败日志含完整上下文日志样本里有 taskId / fileId / type / message
任务长跑监控有看板或告警跟踪"importing / exporting 超过 N 分钟"的记录数
重试时使用新 fileId / 新 taskId失败重试不是简单复用旧任务
修改于 2026-06-22 02:43:30
上一页
整体概述
下一页
整体概述
Built with