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. 文件预览

如何防盗链

在预览接入的过程中,downloadUrl 是接入方(即你的应用)提供给石墨服务端用来下载源文件的入口。它和"用户浏览器下载链接"不是同一回事,如果能明确这个前提,那么绝大多数 401/403、内网不可达、防盗链拦截问题都能在设计阶段避开。

一、下载文件的是石墨文档中台服务端,不是用户的浏览器#

石墨在生成预览时,会用接入方在元信息回调里返回的 downloadUrl,从石墨服务端主动发起一次 HTTP 下载,再把下载到的文件流交给后端解析引擎转换成预览资源,最后才把渲染好的页面推给用户浏览器。
第 3 步是关键。这一步发起方是石墨文档中台服务端,所以默认情况下:
没有用户浏览器的 Cookie、Session、SSO 登录态
没有用户的 IP、Referer、UA
走的是公网,不是用户内网(除非接入方专门拉了专线 / 网关白名单)
所有防盗链规则都要在"一台陌生服务器来拉文件"这个前提下设计。

二、downloadUrl 必须满足的四个条件#

条件含义反例
公网可达石墨服务端能直接访问,不依赖内网或专线(除非已打通)http://10.0.0.5/...、http://internal-bucket.local/...
自包含鉴权URL 本身带短期凭证,不依赖 Cookie / Session / SSOhttps://corp.com/file/123(需登录)
过期时间够长至少覆盖一次完整下载 + 解析的时间30 秒签名 + 100 MB 大文件
内容随文件变化文件内容变更后生成新的 fileId 和新的 downloadUrl对象存储覆盖写、URL 不变

三、常见防盗链规则与对应改法#

防盗链规则表现改法
校验 Cookie / Session服务端下载得到 HTML 登录页或 401改为短期签名 URL,凭证放进 query string
校验 Referer服务端下载返回 403关闭 Referer 校验,或在 CDN / 网关层为石墨出口 IP 段放行
校验 User-Agent服务端下载返回 403关闭 UA 校验,或为石墨 UA / 出口 IP 放行
校验客户端 IP仅允许用户当时的 IP,服务端来时被拒改为不绑 IP 的签名,或绑石墨出口 IP 段
仅内网可达服务端下载超时 / 拒绝连接走公网网关、对象存储外网域名,或接专线
落到实操上,最稳的方案就是对象存储或 CDN 的短期签名 URL(S3 presigned URL、阿里云 OSS / 腾讯云 COS 临时签名等)—— 鉴权信息全在 URL 里,天然满足上一节的四个条件。

四、签名 URL 怎么签#

四条经验值:
1.
过期时间 ≥ 10 分钟。常规文档够用;大文件(数十 MB 以上)或解析较慢的格式(pptx、复杂 xlsx)建议 30 分钟。
2.
凭证放进 query string,不依赖请求 header。
3.
不要在 URL 里放长期 token / AK,只放本次下载用的临时签名。
4.
每次元信息回调动态生成,不要缓存复用;文件内容变化后必须重签。
正例:
https://oss.example.com/files/abc.docx
  ?Expires=1716800000
  &OSSAccessKeyId=STS.xxx
  &Signature=...
  &security-token=...
反例:
https://corp.example.com/api/files/abc.docx        # 需要 Cookie 登录
https://internal.example.com/files/abc.docx        # 内网地址
https://example.com/files/abc.docx?token=LONG_AK   # 长期 AK 暴露

五、上线前怎么验证#

在一台与用户浏览器无关的服务器上跑 curl,模拟石墨服务端视角:
通过标准:
HTTP 状态码是 200,不是 302(重定向到登录页是最常见的隐性失败)
Content-Length 与真实文件大小一致
Content-Type 是文件真实类型,不是 text/html
多次请求都能成功,不是只能用一次
任意一条不满足,就是 downloadUrl 没设计对。建议把这条 curl 命令固化进自动化测试,每次发布预览接入相关改动时都跑一遍。

六、回调接口的其他字段#

除了 downloadUrl 之外,元信息回调里有两个字段经常和防盗链一起翻车:
ext:当 downloadUrl 的响应头无法准确返回 Content-Type / Content-Disposition 时(比如对象存储统一返回 application/octet-stream),用 ext 兜底告诉石墨这是什么类型。不带点,例如 docx,不是 .docx。
permissions.readable:2021-12-01 之后强制必填,缺失会让预览在权限校验阶段直接失败。
字段定义详见 获取文件元信息-预览文档。预览失败后的全链路排查见 文件预览失败排查指南。

七、小结#

把石墨服务端当成"一台不在你内网、没有用户登录态的陌生服务器",给它一条公网可达、短期签名、自包含鉴权的下载链接,防盗链问题基本就到此为止。
排查时如果服务端拿到的是 HTML 登录页、401、403 或超时,回到第三节按规则类型对号入座,再用第五节的 curl -I 在生产环境复现一次,问题归属通常一眼就能看出来。
修改于 2026-06-22 02:43:30
上一页
如何预热预览缓存
下一页
常见问题处理
Built with