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,

防止以后出错,特此记录

相关推荐
像是套了虚弱散9 小时前
DevEco Studio与Web联合开发:打造鸿蒙混合应用的全景指南
开发语言·前端·华为·harmonyos·鸿蒙
鸿蒙小白龙14 小时前
OpenHarmony 6.0 低空飞行器开发实战:从AI感知检测到组网协同
人工智能·harmonyos·鸿蒙·鸿蒙系统·open harmony
大雷神14 小时前
【成长纪实】Flutter中Dart 与Harmony中 ArkTS 异步编程对比:从 Future 到 Promise
flutter·harmonyos
Swift社区14 小时前
在 HarmonyOS 中平滑切换“点状粒子”与“图片粒子”(含可运行 ArkTS 示例)
华为·harmonyos
猫林老师14 小时前
HarmonyOS多媒体开发:自定义相机与音频播放器实战
数码相机·音视频·harmonyos
逻极15 小时前
HarmonyOS 5 鸿蒙应用签名机制与安全开发实战指南
harmonyos
zhuweisky20 小时前
实现一个纯血鸿蒙版(HarmonyOS)的聊天Demo,并可与其它PC、手机端互通!
harmonyos·im·聊天软件
多测师_王sir21 小时前
鸿蒙hdc命令【杭州多测师】
华为·harmonyos
一点七加一1 天前
Harmony鸿蒙开发0基础入门到精通Day01--JavaScript篇
开发语言·javascript·华为·typescript·ecmascript·harmonyos
那年窗外下的雪.1 天前
鸿蒙ArkUI布局与样式进阶(十二)——自定义TabBar + class类机制全解析(含手机商城底部导航案例)
开发语言·前端·javascript·华为·智能手机·harmonyos·arkui