预览链接doc、docx类型没有回传token,但pdf、excel类型却回传了token

阅读次数 2

js-sdk 版本 1.1.20

_w_tokentype=1 在链接中已传,得到的预览链接中也包含「_w_tokentype=1」

代码

引用的文件 web-office-sdk-v1.1.20.umd.js

console.log('引入后可以开始使用 JSSDK 了~');
console.log(WebOfficeSDK);

const webOfficeHost = document.getElementById('webOfficeHost').value;

async function getOrCreateFileId(params) {
    const formData = new FormData();
    Object.entries(params).forEach(([key, value]) => formData.append(key, value));
    const response = await fetch(webOfficeHost + '/wps/getOrCreateFileId', {
        method: 'POST',
        body: formData
    });
    if (!response.ok) {
        throw new Error(`HTTP ${response.status} ${response.statusText}: ${await response.text()}`);
    }
    return await response.json();
}

async function getPreviewLink({ fileId, userId, userName, minioAccessPolicy }) {
    const url = webOfficeHost + `/wps/previewLink?fileId=${encodeURIComponent(fileId)}&userId=${encodeURIComponent(userId)}&userName=${encodeURIComponent(userName)}&minioAccessPolicy=${minioAccessPolicy}`;
    const response = await fetch(url, { method: 'GET' });
    if (!response.ok) {
        throw new Error(`HTTP ${response.status} ${response.statusText}: ${await response.text()}`);
    }
    return await response.json();
}

document.getElementById('previewButton').onclick = async function () {
    const params = {
        minioConfigKey: document.getElementById('minioConfigKey').value,
        minioBucketName: document.getElementById('minioBucketName').value,
        minioObjectName: document.getElementById('minioObjectName').value,
        minioAccessPolicy: document.querySelector('input[name="minioAccessPolicy"]:checked').value,
        userId: document.getElementById('userId').value,
        userName: document.getElementById('userName').value
    };
    const resultDiv = document.getElementById('result');
    try {
        const data = await getOrCreateFileId(params);
        resultDiv.innerHTML = '
 获取文件 Id 成功 
' + JSON.stringify(data, null, 2) + '
'; const fileId = data.data; const previewLinkResult = await getPreviewLink({ fileId, userId: params.userId, userName: params.userName, minioAccessPolicy: params.minioAccessPolicy }); const previewLink = previewLinkResult.data.link; console.log('预览链接:', previewLink); // 配置刷新 token 函数 const refreshToken = () => { const refreshPreviewLink = getPreviewLink({ fileId, userId: params.userId, userName: params.userName, minioAccessPolicy: params.minioAccessPolicy }); // 可以返回 Promise 或者 return { token, timeout } return Promise.resolve({ // 必需:根据自身的业务需求,通过异步请求或者模板输出的方式,取得 token token: refreshPreviewLink.data.token, // 必需:token 超时时间,单位为毫秒 timeout: refreshPreviewLink.data.tokenTimeoutSeconds * 1000, }); }; const jssdk = WebOfficeSDK.config({ // 该地址需要对接方服务端提供,形如 https://wwo.wps.cn/office/p/xxx url: previewLink, refreshToken // 更多配置参数... }) // 设置 token jssdk.setToken({ // 必需:根据自身的业务需求,通过异步请求或者模板输出的方式,取得 token token: previewLinkResult.data.token, // 必需:token 超时时间,单位为毫秒 timeout: previewLinkResult.data.tokenTimeoutSeconds * 1000, }); } catch (e) { console.log("请求失败: ", e); resultDiv.innerHTML = '请求失败: ' + e.message + ''; } };
1 Answers

预览 URL 错误分析

访问失败特征 &wpsCachePreview&hideHeader 访问成功特征 simple&hidecmb

错误原因:jssdk 预览时不同文件的「预览模式」不同

文字文件 w 「"doc", "dot", "wps", "wpt", "docx", "dotx", "docm", "dotm", "rtf", "txt", "mht", "mhtml", "htm", "html", "uot3"」使用的是 cache :缓存预览

版式文件 f 「"pdf", "ofd"」使用的是 ordinary :普通预览

解决方案

服务端请求预览链接时,统一使用「普通预览」模式,请求参数中添加 preview_mode=ordinary