HarmonyOS 鸿蒙Next关于调用filepicker组件进行文件保存问题
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组件进行文件保存的问题,以下是一些可能的解决方案:
-
确保权限正确:通过Picker访问相关文件无需申请权限,但请确保应用已获取写入存储的权限,可通过系统设置或应用内权限管理进行确认。
-
正确创建和使用选择器:
- 根据文件类型(如文档、音频、图片等)创建相应的保存选项实例,并设置保存文件名、文件类型等参数。
- 创建文件选择器实例时,需传入正确的上下文(context)。
- 调用save()接口拉起FilePicker界面,用户选择目标文件夹后即可完成文件保存操作。
-
处理返回的URI:
- 文件保存成功后,会返回保存文档的URI。该URI权限是临时读写权限,待退出应用后台后失效。
- 若需要在应用外查看所保存的文件,可尝试使用用户无感的安全控件创建媒体资源,或参考文件持久化授权访问以获取持久化权限。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。