HarmonyOS 鸿蒙Next关于调用filepicker组件进行文件保存问题

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next关于调用filepicker组件进行文件保存问题

关于调用filepicker组件进行文件保存问题 应用中需要在用户选择保存目录之后,批量从应用沙箱目录中将文件移动到选择的公共目录中,在api文档中未成功实现该场景,希望能提供下相关demo,谢谢

2 回复

可以试试下面这段代码:

import common from '[@ohos](/user/ohos).app.ability.common';
import fs from '[@ohos](/user/ohos).file.fs';
import { picker } from '[@kit](/user/kit).CoreFileKit';

let context = getContext(this) as common.UIAbilityContext;

let fileNameArr = ['1.txt', '2.txt']

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Page10 {
 [@State](/user/State) message: string = 'Hello World';

 build() {
   Column() {
     Button('1、WORD文件写入沙箱')//将源文件放在rawfile目录下
       .onClick(() => {
         for (let index = 0; index < fileNameArr.length; index++) {
           this.rawToFile(fileNameArr[index])
         }
       })

     Button('2、多个文件保存到手机文件管理')
       .onClick(() => {
         this.save()
       })

   }
 }

 rawToFile(fileName: string) {

   context.resourceManager.getRawFileContent(fileName, (_err, value) => {
     let myBuffer: ArrayBufferLike = value.buffer
     let filePath = context.filesDir + '/' + fileName
     console.log("rawToFile中filePath:" + filePath);

     let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
     let writeLen = fs.writeSync(file.fd, myBuffer);
     console.info("写入数据和文件成功:" + writeLen);
     console.info("沙箱名称是:" + fileName);
     fs.closeSync(file);
   });
 }

 save() {
   console.log('fileNameArr:' + fileNameArr)
   const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器保存选项实例
   documentSaveOptions.newFileNames = fileNameArr; // 保存文件名(可选)

   const documentViewPicker = new picker.DocumentViewPicker;
   documentViewPicker.save(documentSaveOptions)
     .then((documentSaveResult) => {
       // 获取到到图片或者视频文件的URI后进行文件读取等操作
       console.info('documentSaveResult.save successfully, audioSaveResult uri: ' + JSON.stringify(documentSaveResult))
       let filePath = ''

       let uri = ''
       for (let index = 0; index < documentSaveResult.length; index++) {
         uri = documentSaveResult[index]
         console.log(`uri${index}:${uri}`)
         filePath = context.filesDir + '/' + fileNameArr[index]
         console.log('循环filePath:' + filePath)
         // 沙箱路径文件
         let sanFile = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
         let pubFile = fs.openSync(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
         // 将文件从沙箱路拷贝到公共路径
         fs.copyFileSync(sanFile.fd, pubFile.fd)
         fs.closeSync(sanFile)
         fs.closeSync(pubFile)
       }
     })
     .catch((err: Error) => {
       console.error(`Invoke documentPicker.select failed, message is ${err.message}`);
     })
 }
}

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


关于HarmonyOS 鸿蒙Next调用filepicker组件进行文件保存的问题,以下是一些可能的解决方案:

  1. 确保权限正确:通过Picker访问相关文件无需申请权限,但请确保应用已获取写入存储的权限,可通过系统设置或应用内权限管理进行确认。

  2. 正确创建和使用选择器

    • 根据文件类型(如文档、音频、图片等)创建相应的保存选项实例,并设置保存文件名、文件类型等参数。
    • 创建文件选择器实例时,需传入正确的上下文(context)。
    • 调用save()接口拉起FilePicker界面,用户选择目标文件夹后即可完成文件保存操作。
  3. 处理返回的URI

    • 文件保存成功后,会返回保存文档的URI。该URI权限是临时读写权限,待退出应用后台后失效。
    • 若需要在应用外查看所保存的文件,可尝试使用用户无感的安全控件创建媒体资源,或参考文件持久化授权访问以获取持久化权限。

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

回到顶部