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,

防止以后出错,特此记录

相关推荐
高心星3 小时前
HarmonyOS 5.0应用开发——MVVM模式的应用
harmonyos·mvvm·鸿蒙5.0·备忘录应用
别说我什么都不会4 小时前
【仓颉三方库】工具类—— compress4cj
harmonyos
别说我什么都不会4 小时前
【仓颉三方库】工具类—— uuid4cj
harmonyos
__Benco10 小时前
OpenHarmony - 小型系统内核(LiteOS-A)(十),魔法键使用方法,用户态异常信息说明
人工智能·harmonyos
NapleC1 天前
HarmonyOS:一多能力介绍:一次开发,多端部署
华为·harmonyos
我爱学习_zwj1 天前
【鸿蒙HarmonyOS】深入理解router与Navigation
华为·harmonyos
NapleC1 天前
HarmonyOS:1.7
harmonyos
鸿蒙布道师1 天前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师1 天前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei