HarmonyNext保存Base64文件到Download下

本文介绍如何保存Base64的文件到Download下

参考文档地址:

保存用户文件-Harmony Next

用到的是DOWNLOAD模式保存文件

用户在使用save接口时,可以将pickerMode配置为DOWNLOAD模式,该模式下会拉起授权接口,用户确认后会在公共路径download目录下创建用户当前hap包名的文件夹,并通过save接口返回值回传相应的URI,后续用户可以直接将文件保存在该URI下。

本文里面的Base64Utils和JSONutils都是来自于:

复制代码
@pura/harmony-utils 1.0.2

参考代码如下

复制代码
 param =
      "{\"dataBase64\":\"data:audio/midi;base64,TVRoZAAAAAYAAQACAeBNVHJrAAAAIQD/UQMLcbAA/1kCAAAA/1gEBAIYCAD/AQR0dHR0AP8vAE1UcmsAAACrAMAAALB5AACwQAAAsFswALAKQACwB2QAkEdpgXCARwAAkEdVgXCARwAAkEdfgXCARwAAkEdVgXCARwAAkEBfgXCAQAAAkEVVgXCARQAAkD5fgXCAPgAAkENVgXCAQwAAkEdfgXCARwAAkEdVgXCARwAAkEdfgXCARwAAkEdVgXCARwAAkEBfgXCAQAAAkENVgXCAQwAAkEBfgXCQRVUDgEAAgXCARQAA/y8A\",\"fileType\":\"midi\",\"fileName\":\"tttt\"}"
    if (StringUtils.isStrNotBlank(param)) {
      const h5CallBackBean: H5CallBackBean | null = JSONUtil.jsonToBean<H5CallBackBean>(H5CallBackBean, param)
      if (h5CallBackBean) {
        if ('midi' == h5CallBackBean.fileType) {
          const fileBase64 = h5CallBackBean.dataBase64
          if (StringUtils.isStrNotBlank(fileBase64)) {
            const base64: string = fileBase64.split(",")[1]
            const numTemp: number = DateUtil.getTodayTime()
            let uri: string = '';
            // 请确保 getContext(this) 返回结果为 UIAbilityContext
            let context = getContext(this) as common.Context;
            const documentViewPicker = new picker.DocumentViewPicker(context);
            const documentSaveOptions = new picker.DocumentSaveOptions();
            documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD;
            // documentSaveOptions.newFileNames = [numTemp + '.midi']
            documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
     if (documentSaveResult.length>0) {
            uri = documentSaveResult[0];
              console.info('documentViewPicker.save succeed and uri is:' + uri);
              //得到uri后,需要使用FileUri做一层转换,才可以做后续读写的操作
              let path: string = new fileUri.FileUri(uri).path
              //得到path后拼接文件名
              let filePath: string = `${path}/${numTemp}.midi`;
              if (StringUtils.isStrNotBlank(filePath)) {
                if (UiUtils.saveBase64File(base64,filePath)) {
                  ToastUtil.showToast("保存成功")

                }


              }
}
           
            }).catch((err: BusinessError) => {
              console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
            })

          }

        }

      }




  /**
   *保存base64文件
   *
   * @param context上下文
   * @param base64base64文件内容
   * @param filePath文件路径
   * @returns是否保存成功
   */
  public static saveBase64File(base64: string, filePath: string): boolean {
    if (!base64 || !filePath) {
      return false;
    }
    const imageBuffer = Base64Util.decodeSync(base64);
    try {
           //这边要多加一个fs.OpenMode.CREATE得到创建文件的权限
                let file  = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                console.info("file fd: " + file.fd);
                //因为writeSync的入参类型是ArrayBuffer或string,所以这边要使用.buffer转换成ArrayBuffer类型,否则会报错。
     
   fs.writeSync(file.fd, imageBuffer.buffer);
        fs.closeSync(file);
    } catch (err) {
      Logger.error(CommonConstants.TAG, `saveBase64File err: ${err}`);
      return false;
    }
    return true;
  }

需要注意的是:

1.得到uri后,需要使用FileUri做一层转换,才可以做后续读写的操作

2.因为writeSync的入参类型是ArrayBuffer或string,所以这边要使用.buffer转换成ArrayBuffer类型,否则会报错。

否则出现Error: Operation not permitted,

防止以后出错,特此记录

相关推荐
IntMainJhy9 分钟前
【flutter for open harmony】第三方库Flutter 鸿蒙实战:商品详情页完整实现 + 点击跳转失效问题修复✨
flutter·华为·harmonyos
枫叶丹43 小时前
【HarmonyOS 6.0】ArkWeb PDF预览回调功能详解:让PDF加载状态可控可感
开发语言·华为·pdf·harmonyos
nashane4 小时前
HarmonyOS 6学习:音频焦点管理实战——解决应用打开中断听书功能的技术指南
学习·音视频·harmonyos·harmonyos 5
nashane5 小时前
HarmonyOS 6学习:位置权限已开启却仍报错?深度解析与实战解决方案
学习·华为·harmonyos·harmonyos 5
被温水煮的青蛙5 小时前
ArkUI List 图片拖动排序最佳实践
harmonyos
liulian09166 小时前
【Flutter for OpenHarmony第三方库】Flutter for OpenHarmony应用更新检测功能实战指南
flutter·华为·学习方法·harmonyos
IntMainJhy6 小时前
【Flutter for OpenHarmony 】第三方库 实战:`cached_network_image` 图片缓存+骨架屏鸿蒙适配全指南✨
flutter·缓存·harmonyos
轻口味6 小时前
HarmonyOS 6 轻相机应用开发1:功能介绍与框架搭建
数码相机·华为·harmonyos
nashane7 小时前
HarmonyOS 6学习:界面布局“消消乐”——实战拆解组件遮挡与快照技术
深度学习·学习·harmonyos·harmony app
枫叶丹47 小时前
【HarmonyOS 6.0】ArkWeb PDF浏览能力增强:指定PDF文档背景色功能详解
开发语言·华为·pdf·harmonyos