【鸿蒙二开】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

怎么落到本应用路径

推荐固定分支:

  1. code !== OK:按 msg 处理失败。

  1. OK && !data:仅打开成功,提示关窗。

  1. transferFd:分块读入 filesDir,校验 size,关闭 fd。

  1. fileUri:只读打开后 copyFileSyncfilesDir/wps_callback/

  1. 后续上传只用拷贝后的路径,不要再用打开前的 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

湖北省
浏览 109
收藏
5
分享
5 +1
+1
全部评论