@heybox/hb-sdk API Reference - v0.9.5
    正在准备搜索索引...
    • 让用户选择一个精确的文件保存目标。

      参数

      返回 Promise<FileHandle>

      用户确认后的冻结 FileHandle direct proxy。kind 固定为 'file',name 是 Host 最终文件 basename,mode 固定为 'readwrite';不包含真实路径,也不授予父目录或 兄弟文件访问权。

      HbMiniProgramSDKError options 缺失/非对象、suggestedName 非字符串或不是规范 basename、或传入 V1 不支持的 accept 时返回 INVALID_PARAMS;缺少当前可信用户手势时 返回 USER_GESTURE_REQUIRED;用户取消系统保存界面时返回 FILE_PICKER_CANCELLED。

      HbMiniProgramSDKError 当前运行快照缺少或未启用 filesystem 时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放/未协商到保存 operation 时返回 METHOD_FORBIDDEN,旧 Runtime 可返回 METHOD_NOT_FOUND。目标已存在且 Host 不能独占创建 时返回 FILE_ALREADY_EXISTS,不会静默覆盖。

      HbMiniProgramSDKError 当前 session 的外部 direct handle 达到 1024 上限时返回 FILE_QUOTA_EXCEEDED;授权在完成前失效、Host 返回非精确 File、非 readwrite mode、非法 descriptor 或其他 picker/I/O 失败时返回 FILE_ACCESS_REVOKED / FILE_IO_FAILED 等稳定 文件错误码。

      必须直接从按钮点击等可信用户操作调用。不要先 await 握手或其他异步任务;应提前通过 getHandshakeState() / onHandshakeStateChange() 控制按钮只在 ready 时可用,再在点击回调 中立即调用。取消是正常用户结果,应按 FILE_PICKER_CANCELLED 结束当前流程。 选择器等待不设固定超时;用户确认、取消或当前 SDK / Runtime 会话结束后才结束操作。

      返回的是当前 Runtime session 内一个精确外部 File 授权,不会额外保留或暴露父 Directory handle。它占用 picker / saveFile() 共享的 1024 direct-handle 配额中的一个;session 结束 或授权撤销后不能恢复或持久化复用。代理固定 readwrite,可调用 writeText() / writeBytes(),或作为 network.download 的 File target;外部授权仍不能调用 remove()。

      V1 没有 overwrite 选项。当前新 PC Host 先让用户选择保存目录,再以 suggestedName 独占 创建空文件;同名目标返回 FILE_ALREADY_EXISTS。其他 Host 可以展示平台原生保存界面, 但成功结果仍只授权最终精确 File,且不能通过该 API 请求静默覆盖。

      Android 已适配客户端支持 files.saveFile,系统保存器返回精确 SAF 文件授权,不授予 父目录权限。writeText() / writeBytes() 先暂存完整内容,再写入该目标;最终 Provider 写入不是原子替换,失败时目标可能为空或部分写入,原内容不保证保留。该授权不支持 network.download() 的原子替换,导出请调用文件代理的写入方法。

      新 PC、Android 与 iOS Host 支持该能力。OHOS 按 Host 实际宣告的 operation 启用。Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不 提供 Blob/内存 fallback。页面代码不应仅按操作系统判断,应处理 METHOD_FORBIDDEN。

      import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'

      const saveButton = document.querySelector<HTMLButtonElement>('#save-report')!

      saveButton.addEventListener('click', async () => {
      try {
      const file = await hbSDK.files.saveFile({ suggestedName: 'report.json' })
      await file.writeText(JSON.stringify({ ok: true }))
      console.log(file.kind, file.name, file.mode)
      } catch (error) {
      if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_PICKER_CANCELLED') return
      throw error
      }
      })

      0.8.0

      android

      ios

      ohos

      windows

      macos

      android numeric-dot >= 1.3.396

      ios numeric-dot >= 1.3.396

      ohos none

      windows none

      macos none