云计算百科
云计算领域专业知识百科平台

业务系统里打开文档总是要先下载,该怎么在线预览?

文章目录

    • 一、预览区放在业务页面里
    • 二、创建应用
    • 三、前端嵌入预览
    • 四、用真实文档核对
    • 五、官方文档

业务系统的 OA、合同或附件列表里,用户点击一份文档后,浏览器底部出现下载。文件落到本地,再用 WPS 客户端打开。没有客户端的电脑、临时工位和手机都看不了这份文档,体验非常割裂,反复下载文件也会非常占用用户内存 😭

常见实现是把附件名直接链到 .docx 地址,或接口用 Content-Disposition: attachment 返回文件。浏览器会把它当成下载任务,不会在当前页渲染。用户本意只是想预览和编辑文档,并没有选文档「另存为」,只是业务系统把文档预览做成了下载。

本文面向要把文档预览嵌进业务系统的接入方。读完可以做到:同一份附件在业务页面中打开,即时渲染,所见即所得,不触发下载,也不要求安装客户端 ✨

做法是:附件列表的点击打开业务侧预览页,并带上该文件在业务中的 ID,例如 /preview?fileId=合同附件记录 ID。文字文档都进这个页,不要对文件存储地址使用 window.open。

业务系统打开文档:左侧点附件会下载,右侧在页面里预览

左边是现在常见的路径,右边是嵌进页面之后的路径。  

一、预览区放在业务页面里

接入方需提前在业务页面中预留好用于渲染预览的区域容器。用户点击附件列表中的 .docx 后,文档会在该区域内直接打开:地址栏仍保持业务域名,浏览器底部也不会出现下载栏。。

下表对比现在和做成之后:

对比现在做成之后
点附件 浏览器开始下载 当前页或预览页打开
看内容 需安装 WPS 客户端 在浏览器中查看
文件位置 本机下载目录增加一份副本 文件仍在业务存储中

本文使用 WPS 开放平台的 WebOffice。前端通过 Web SDK 在页面中嵌入 iframe。文件来源和访问权限由接入方服务端回调提供。

开始前准备:开放平台账号、一份带标题和表格的真实 .docx。本教程将带大家完成以下三件事:创建应用、把预览嵌进页面、用真实文档验证。  

二、创建应用

  • 打开 WPS 开放平台,进入开发者后台。
  • 创建企业集成应用。创建完成后,在应用信息中复制 AppID。
  • 在应用详情的应用能力中开启在线预览编辑。可先走试用,把预览跑通。步骤见快速开始。
  • 注意: AppSecret 只放在服务端,不要写进页面代码。

    从下载版本获取最新 JSSDK (v1.1.20 及以上),不要用过旧的 umd 包对接当前文档。  

    三、前端嵌入预览

    将 web-office-sdk-solution.umd.js 放到页面可引用的路径(官方包文件名)。文字文档使用 OfficeType.Writer。fileId 是业务系统中的文件 ID。WebOffice 用这个 ID 向回调服务请求文件。

    给挂载节点设置明确宽高(受 iframe 限制,容器没有具体宽高时,文档可能无法渲染)

    以下是实现代码示例(可参考前端快速开始,落地前记得将 APP_ID、FILE_ID 换成实际值):

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta charset="UTF-8" />
    <meta
    name="viewport"
    content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"
    />

    <title>附件预览</title>
    <style>
    html,
    body
    {
    margin: 0;
    height: 100%;
    }
    #office {
    width: 100%;
    height: 100%;
    }
    </style>
    </head>
    <script src="./web-office-sdk-solution.umd.js"></script>
    <body>
    <div id="office"></div>
    <script>
    window.onload = function () {
    var instance = WebOfficeSDK.init({
    officeType: WebOfficeSDK.OfficeType.Writer,
    appId: "APP_ID",
    fileId: "FILE_ID",
    mount: document.querySelector("#office"),
    });

    instance.on("fileOpen", function (data) {
    if (data && data.success) {
    console.log("预览打开了");
    }
    });
    };
    </script>
    </body>
    </html>

    APP_ID 是开发者后台的应用 ID。FILE_ID 是业务系统里这份文档的文件 ID,不是公网文件链接。

    init 会在 #office 中插入 iframe。

    说明: fileOpen 在打开成功或失败时都会触发。参数里 success 为 true 时,控制台出现「预览打开了」。失败或页面空白时,到开发者后台进行日志排查。常见原因是回调未接通,或 officeType 与文件类型不一致。

    说明: 若预览区在标签页或侧栏里,初始化时节点为 display:none 或高度为 0,打开后也会空白。先让 #office 在可见区域占满一屏,验证通过后再调整布局。手机用微信打开时,页面 viewport 可参考官方移动端来写,否则 iframe 里会图标过小、双击放大。

    表格使用 OfficeType.Spreadsheet,演示文稿使用 Presentation。类型填错可能导致打开失败或乱码。附件列表同时有文字文档和表格时,按后缀选择 officeType,不要固定为 Writer。  

    四、用真实文档核对

    流程跑通后,可用业务里的真实合同、通知(至少包含标题、表格和页眉)进行生产环境下的核对检验。从附件进入预览页后核对:   1. 浏览器未开始下载 2. 正文和表格在页面中可见 3. 未要求安装 WPS 客户端   PC端用 Chrome 80 以上的浏览器核对完这三项后,可再用微信打开同一份附件,验证移动端也能同时适配。

    主路径到这里就通了:列表点击附件 → 预览页携带 fileId → SDK init → 页面中显示文档。过程中不应再次触发下载。

    接入 OA 还要配服务端回调:回调网关须公网可访问,文件下载地址和预览权限在回调中返回。可参考官方 Web SDK 概述 和服务端回调,先把本地 Demo 跑通。  

    五、官方文档

    • WPS 开放平台
    • 快速开始(建应用、试用)
    • 开发者后台
    • Web SDK 概述
    • 前端快速开始(init 参数)
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 业务系统里打开文档总是要先下载,该怎么在线预览?
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!