【鸿蒙二开】WPS SDK 关闭回传后如何拿到 filePath
二开里「能打开 WPS」和「关窗后拿到最新文件」是两件事。不少同学 OpenFileRequest 已经能编辑,上传却一直是打开前的旧附件。根因通常是:开启关闭回传以后,result.data.fileUri 仍在 WPS 沙箱,必须拷贝到本应用沙箱,才能得到业务上传可用的 filePath。本帖按最短路径说明开启方式、解析分支和常见坑,适合已能打开文档、还差关窗回写的鸿蒙开发者。
何时需要 filePath
编辑后要上传、走流程、写回业务库 → 需要关闭回传并落盘。纯预览可不配置回传;此时 OK 且无 data 是正常现象,不要当成失败。评审时追问「关窗后文件去哪」,避免上线前才发现缺口。
怎么开
在 OpenFileRequest 上设 wpsTransferType(推荐)或 enableTransferFile。后者为 true 时按 URI 回传;前者可显式选 URI 或 FD,且优先级更高。工程建议只保留 wpsTransferType。
const req = new OpenFileRequest(ctx, sandboxPath);
req.enableEdit = true;
req.wpsTransferType = TransferType.URI; // 或 TransferType.FD
const result = await WPSApi.sendRequest(req);用户关闭文档后,data 才可能有值。只从多任务切回应用,经常拿不到回传。可编辑场景请同时设 enableEdit = true。
怎么落到本应用路径
推荐固定分支:
code !== OK:按 msg 处理失败。
OK && !data:仅打开成功,提示关窗。
有 transferFd:分块读入 filesDir,校验 size,关闭 fd。
有 fileUri:只读打开后 copyFileSync 到 filesDir/wps_callback/。
后续上传只用拷贝后的路径,不要再用打开前的 sandboxPath。
function resolveFinalPath(ctx, result) {
if (result.code !== ResultCode.OK || !result.data) return null;
if (result.data.transferFd >= 0) return copyFd(ctx, result.data);
if (result.data.fileUri) return copyUri(ctx, result.data.fileUri);
return null;
}fileUri 不能当长期持久路径。若启用了不落地相关约束,拷贝完成后可按安全策略清理 WPS 临时文件。目标目录记得 mkdirSync。
URI 与 FD
模式 | 要点 |
URI | 联调简单,拷贝后得到本应用路径 |
FD | 少暴露路径字符串,须分块读并 close,建议校验 transferFileSize |
默认先用 URI 跑通;大文件或对路径更敏感时再切 FD。两种模式共用同一 resolve 出口,页面无感。
联调注意
仍上传旧文件:多半没替换路径变量。
FD 泄漏:读完未 close。
目录未创建:先 mkdirSync。
小 docx / 表格各测 URI;大文件再测 FD。
对照「关窗」与「只切回应用」。
关闭回传可与水印、extraOptions 同请求配置;首轮联调建议先只开回传,确认 filePath 稳定再叠其它字段。日志建议输出 code/hasData,便于区分「未关窗」与「拷贝失败」。把 resolve 收成统一函数后,页面与上传队列都不必再理解 WPS 沙箱细节。
小结
最终 filePath = 本应用沙箱落盘结果,不是 WPS 回传 URI 原文。统一 resolve 函数后,页面只关心「有没有拿到路径」。详细字段与 Demo 见官方对接文档;社区欢迎补充不同机型上的回传表现。
更多参数见官方对接文档:https://365.kdocs.cn/l/clQl5cek2NoT
申请 SDK HAR 与凭据:m_open_sdk@wps.cn(注明包名与专业版/个人版需求)。
技术交流 QQ 群:628436767