HarmonyOS 鸿蒙Next 保存文件相关问题

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 保存文件相关问题

保存文件的过程需要无感知,不要让用户选择保存路径,要保存在自己的目录,并且让用户不能在文件管理中打开,因为这个文件是用户的电子证照,每次展示都需要进行活体实人认证,不应该被一次保存多次使用,请问应该怎么实现?需不需要用到受限权限?

2 回复

可以选择保存到沙箱路径,用户无法感知无法打开无法选择路径,不知符不符合的需求 //该demo是从资源目录保存到沙箱目录并预览的demo

import { filePreview } from '@kit.PreviewKit';
import { BusinessError } from '@kit.BasicServicesKit';
import fs from '@ohos.file.fs';
import fileUri from "@ohos.file.fileuri";

let uiContext = getContext(this);
let displayInfo: filePreview.DisplayInfo = {
  x: 100,
  y: 100,
  width: 800,
  height: 800
};
let fileInfo: filePreview.PreviewInfo = {
  title: 'th.jpg',
  uri: 'file://com.example.previewfileapp/data/storage/el2/base/haps/entry/files/th.jpg',
  mimeType: 'image/jpeg'
};

@Entry
@Component
struct Index {

  build() {
    Column() {
      Row() {
        Button('复制')
          .onClick(() => {
            try {
              getContext(this).resourceManager.getRawFileContent("th.jpg", (error: BusinessError, value: Uint8Array) => {
                if (error != null) {
                  console.error("error is " + error);
                } else {
                  let myBuffer:ArrayBufferLike = value.buffer
                  let context = getContext(this);
                  //沙箱路径
                  let filePath = context.filesDir + '/' + "th.jpg";
                  console.log("testTag-filePath:" + filePath);
                  let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                  let writeLen = fs.writeSync(file.fd, myBuffer);
                  console.info("testTag-write data to file succeed and size is:" + writeLen);
                  fs.closeSync(file);
                }
              });
            } catch (error) {
              let code = (error as BusinessError).code;
              let message = (error as BusinessError).message;
              console.error(`callback getRawFileContent failed, error code: ${code}, message: ${message}.`);
            }
          })
      }
      .justifyContent(FlexAlign.SpaceAround)
      .width('100%')

      Row() {
        Button('预览')
          .onClick(() => {
            filePreview.openPreview(uiContext, fileInfo, displayInfo).then(() => {
              console.info('Succeeded in opening preview');
            }).catch((err: BusinessError) => {
              console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
            });
          })
      }
      .justifyContent(FlexAlign.SpaceAround)
      .width('100%')
    }
    .justifyContent(FlexAlign.SpaceAround)
    .height('100%')
    .width('100%')
  }
}

//uri: this.context.filesDir + ‘/’ + “temp.pdf”, 此处需增加应用名,可参考以下demo

let filePath = this.context.filesDir + '/' + "temp.pdf"
let uri = fileUri.getUriFromPath(filePath );

fileInfo: filePreview.PreviewInfo = {
title: 'temp.pdf',
uri: uri ,
mimeType: 'application/pdf'
}

更多关于HarmonyOS 鸿蒙Next 保存文件相关问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS 鸿蒙Next 保存文件相关问题,以下提供直接解答:

在HarmonyOS中保存文件,首先需要确定文件存储的路径和访问权限。系统提供了文件管理器API,允许应用在其私有存储区域或公共存储区域(如外部SD卡)中创建、读取、编辑和删除文件。

  1. 私有存储

    • 使用context.getFilesDir()获取应用私有文件目录。
    • 使用FileOutputStreamFileWriter写入文件。
  2. 公共存储

    • 需要申请READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限(在Manifest文件中声明,并在运行时请求)。
    • 使用Environment.getExternalStorageDirectory()获取外部存储根目录。
    • 自定义子目录和文件名,使用FileOutputStreamFileWriter进行文件写入。
  3. SAF(存储访问框架)

    • 对于更细粒度的存储访问控制,建议使用SAF。
    • 调用Intent启动文件选择器,让用户选择保存位置。
    • 使用UriContentResolver进行文件操作。

确保在保存文件时处理好异常,如IOException,并记录必要的日志以便调试。此外,注意文件命名规范和权限管理,避免文件名冲突和权限不足导致的保存失败。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部