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,

防止以后出错,特此记录

相关推荐
爱笑的眼睛1113 小时前
uniapp 极速上手鸿蒙开发
华为·uni-app·harmonyos
K.P14 小时前
鸿蒙元服务从0到上架【第三篇】(第二招有捷径)
华为·harmonyos·鸿蒙系统
K.P15 小时前
鸿蒙元服务从0到上架【第二篇】
华为·harmonyos·鸿蒙系统
敲代码的小强17 小时前
Flutter项目兼容鸿蒙Next系统
flutter·华为·harmonyos
程序猿会指北17 小时前
纯血鸿蒙APP实战开发——Text实现部分文本高亮和超链接样式
移动开发·harmonyos·arkts·openharmony·arkui·组件化·鸿蒙开发
鸿蒙自习室1 天前
鸿蒙开发——关系型数据库的基本使用与跨设备同步
前端·数据库·华为·harmonyos·鸿蒙
SoraLuna1 天前
「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具
开发语言·macos·ui·华为·harmonyos
资讯分享周1 天前
鸿蒙风起,未来已来——云学堂鸿蒙应用认证开营啦!
华为·harmonyos
Lincode121 天前
HarmonyOS--鸿蒙三方库--lottie
华为·harmonyos
Ai鸿蒙2 天前
鸿蒙Next开发之Android XML 到鸿蒙 ArkUI一键转化
harmonyos