1. 03. 文件预览
石墨文档中台-开发文档
  • 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. 03. 文件预览

常见问题处理

预览失败几乎不是前端 iframe 本身的问题。绝大多数 case 都集中在四个环节之一:石墨服务端拿不到源文件、拿到了但识别不出类型、能识别但解析不了、或者命中了旧的预览缓存。本文按"先看错误码、再按现象排查"的顺序展开,并在最后给出提工单前需要准备的信息清单。

一、30 秒自检#

按下面四个问题依次过一遍,能覆盖 90% 以上的失败:
1.
石墨服务端能否访问 downloadUrl? 公网或专线打通、能拿到 HTTP 200、返回真实文件而不是 HTML 错误页。
2.
下载响应头或 ext 字段是否准确? Content-Type / Content-Disposition 任一存在并正确即可,缺失时必须用元信息中的 ext(不带点)兜底。
3.
文件是否在支持范围内? 格式受支持、未加密、未损坏、未超大小或单元格上限。
4.
文件更新后 fileId 是否换了? 复用旧 fileId 会命中旧预览缓存。

二、预览的数据流#

浏览器 iframe
   │ 1) 加载 iframe(带签名 / 用户身份)
   ▼
石墨预览服务
   │ 2) 调元信息回调 → 接入方返回 downloadUrl、ext、permissions
   │ 3) 用 downloadUrl 下载源文件
   │ 4) 解析、转换、生成预览资源(含 blob: 资源)
   ▼
浏览器渲染
每一步都可能断:
环节典型失败信号
1 加载 iframe页面空白、控制台跨域 / 401 / 403
2 元信息回调控制台或服务端日志报 401 / 5xx,预览任务直接失败
3 下载源文件错误码 90035、预览任务失败
4 解析与渲染错误码 90033(不支持类型)、90042(带密码)、90050/90052/120509(过大)等

三、按错误码定位#

石墨在预览/导入失败时通常会返回明确的错误码。先按下表对号入座:
错误码含义主要排查方向
90033不支持的预览类型文件真实格式、元信息 ext 字段、响应头是否被改写
90035下载失败downloadUrl 可达性、鉴权、HTTP 状态码、是否被重定向到登录页
90042文件带密码先在业务系统侧解密,或提示用户上传未加密版本
90050 / 90052 / 120509文件过大提示用户拆分文件,或在业务系统侧做大小限制
120016文件不支持导入对照支持格式,先转码为 PDF / docx 再走预览
120502 / 120507单元格 / 内容超限拆分表格、清理多余空白单元格
完整错误码及解决方案见 文件预览或导入报错如何处理。
如果界面只是空白、没有任何错误码,看下一节"按现象排查"。

四、按现象排查#

1. 页面空白、没有错误码#

iframe 加载之前就挂了。重点看浏览器侧:
iframe 地址、签名参数、过期时间是否正确
"当前用户"回调(用户身份)是否返回 200 且字段完整
元信息回调是否返回 200,type、downloadUrl、ext、permissions.readable 是否齐全
控制台是否有跨域 / 401 / 403 / 404 / 脚本错误
元信息回调返回的最小样例(参考官方文档):
{
  "id": "ba13551165cc5066",
  "name": "示例文档.docx",
  "type": "file",
  "permissions": { "readable": true },
  "downloadUrl": "https://example.com/download/test.docx",
  "ext": "docx"
}
注意:2021-12-01 之后 permissions 必须返回,否则预览会因权限校验失败而中断。

2. 错误码 90035 / 下载失败#

石墨服务端拿不到源文件。优先验证可达性:
检查响应:
HTTP 状态码必须是 200。302 跳转到登录页是最常见的隐性失败 —— 表面是重定向,最终拿到的是 HTML。
Content-Length 与真实文件大小是否一致。
Content-Type 是文件类型(如 application/vnd.openxmlformats-officedocument.wordprocessingml.document)而不是 text/html。
下载地址不要依赖浏览器 Cookie、内网域名或 SSO 登录态 —— 石墨服务端拿不到这些。
临时签名 URL 的有效期要足够长,至少覆盖一次完整下载 + 解析(建议 ≥ 10 分钟)。
如果响应头里没法给出正确的 Content-Type 或 Content-Disposition,必须在元信息回调里用 ext 字段兜底:
{ "ext": "docx" }   // 正确:不带点
{ "ext": ".docx" }  // 错误:带点会识别失败

3. 错误码 90033 / 不支持的预览类型#

两种可能:扩展名错了,或者真实内容与扩展名不一致。
排查清单:
ext 字段是否在支持范围内:doc / docx / xls / xlsx / ppt / pptx / pdf / txt / md / jpg / png / gif / svg / ofd。
文件真实格式和 ext 是否一致 —— 用 file 命令验证:
文件是否被加密保护(带密码的 docx / pdf 会报 90042,看上去也像"格式不支持")。
文件是否损坏(用本地 Office 软件能否打开)。
不在支持范围内的格式,在业务系统侧先转码为 PDF 或 docx 再走预览。

4. 预览内容不是最新版#

几乎一定是 fileId 复用导致命中了旧的预览缓存。
正确做法:文件内容每次变化,都应生成新的 fileId。
如果业务上确实需要稳定的 ID,可以采用"业务 ID + 内容指纹"组合作为预览用的 fileId,例如 {businessId}-{sha1(content).slice(0,8)}。这样既能定位回业务对象,又能让石墨在内容变更时识别为新文件。
另外要检查的:
downloadUrl 是否还指向旧文件(对象存储覆盖写时 URL 不变,但内容变了,依旧会命中缓存)。
业务侧 CDN / 浏览器缓存是否影响到了 downloadUrl 的下载结果。

5. PC 正常,移动端失败#

通常是 WebView 或 Hybrid 容器能力不全。石墨在转换 PDF / 多媒体时会生成 blob: 资源,很多容器默认屏蔽。
处理建议(详见 移动端不支持 blob 协议导致预览失败):
Android WebView:升级至 Chromium 64+,放行 blob: scheme。
iOS WKWebView:保持默认 dataDetectorTypes,允许 blob: scheme。
安全壳 / Hybrid 容器:把 blob: 加入白名单。
容器实在不支持 blob 时,提示用户用系统浏览器打开。
同时确认元信息回调返回的 Content-Type / Content-Disposition / ext 准确 —— 头信息缺失会让 SDK 退回到 blob 缓存,间接放大不兼容问题。

五、关键字段与响应头对照#

接入方需要保证的"正确性源"集中在两处:元信息回调的返回值,和 downloadUrl 的下载响应。
元信息回调必填字段
字段说明易错点
id文件在业务系统中的 ID内容变化时建议换 ID,避免命中旧缓存
type固定填 file误填为 doc 等其他值会触发协同文档分支
permissions.readable当前用户是否可读2021-12-01 后强制必填
downloadUrl公网可达的下载地址不能依赖 Cookie / SSO,签名 URL 有效期足够长
ext文件扩展名不带点,仅在响应头无法识别时兜底,但强烈建议总是返回
下载响应头建议
HTTP/1.1 200 OK
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
Content-Disposition: attachment; filename="示例文档.docx"
Content-Length: 24631
Content-Type 和 Content-Disposition 任一存在且正确即可;都不准确时由元信息中的 ext 兜底。完整 Header 要求见 石墨官方文档。

六、还没有解决?#

假如排查到这一步仍然无法定位故障原因,可以尝试提供下面这些信息给石墨文档售后,让石墨协助你排查问题。
基本定位:fileId、用户 ID、问题发生时间
环境信息:浏览器版本 / WebView 版本 / App 容器、操作系统
完整 iframe 地址(脱敏后保留签名结构)
元信息回调的请求和响应原文
当前用户回调的请求和响应原文
在服务端环境对 downloadUrl 发起 curl -I 的结果(状态码 + 响应头)
文件真实大小、真实 MIME 类型(file --mime-type 输出)
石墨返回的错误码、错误信息、taskId

七、小结#

预览失败时,请按下面这个固定顺序走,绝大多数问题不超过两步就能定位:
1.
看错误码 → 对照第三节表格
2.
没有错误码 → 按第四节"现象"分支
3.
仍未定位 → 收集第六节邀请石墨协助排查
修改于 2026-06-22 02:43:30
上一页
如何防盗链
下一页
整体概述
Built with