HarmonyOS鸿蒙Next中使用fs.open无法打开photoViewPicker选择文件的uri

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

HarmonyOS鸿蒙Next中使用fs.open无法打开photoViewPicker选择文件的uri 使用fs.open无法打开photoViewPicker选择文件的uri

4 回复

可能使用fs.stat获取文件信息时直接使用photoViewPicker返回的uri是没有权限的,参考以下代码

//缓存目录
let context = this as common.UIAbilityContext;
let cacheDir = context.cacheDir;

photoViewPicker.select(photoSelectOptions).then(async (photoSelectResult: picker.PhotoSelectResult) => {
  uris = photoSelectResult.photoUris;
  console.info('photoViewPicker.select to file succeed and uris are:' + uris);

  let uri: string = uris[0];
  let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
  // 复制文件到缓存目录下
  fs.copyFileSync(file.fd, cacheDir + '/test.jpeg')
  fs.stat(cacheDir + '/test.jpeg').then((stat: fs.Stat) => {
    console.info("get file info succeed, the size of file is " + stat.size);
  }).catch((err: BusinessError) => {
    console.error("get file info failed with error message: " + err.message + ", error code: " + err.code);
  });
}).catch((err: BusinessError) => {
  console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
})

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fs-V5#fsstat

更多关于HarmonyOS鸿蒙Next中使用fs.open无法打开photoViewPicker选择文件的uri的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


fs.openSync(sourceFilePath, fs.OpenMode.READ_ONLY)

打开文件要添加第2个参数,photoViewPicker打开的文件只有临时权限

在HarmonyOS鸿蒙Next中,使用fs.open无法直接打开photoViewPicker选择的文件的URI,因为photoViewPicker返回的URI是一个内容URI(Content URI),而不是文件路径。内容URI需要通过ohos.app.ability.DataAbilityHelper来访问文件数据。

你可以使用DataAbilityHelperopenFile方法来打开内容URI对应的文件。具体代码如下:

import dataAbilityHelper from '@ohos.app.ability.DataAbilityHelper';
import fileio from '@ohos.fileio';

let helper = dataAbilityHelper.createDataAbilityHelper(context);

let fd = await helper.openFile(uri, 'r');
if (fd !== null) {
    let file = fileio.fdopen(fd, 'r');
    // 现在你可以使用file对象进行文件操作
}

在HarmonyOS鸿蒙Next中,fs.open无法直接打开photoViewPicker返回的URI,因为该URI是内容URI(content://),需要通过ohos.file.fs模块的open方法结合ohos.file.fileuri模块进行处理。具体步骤如下:

  1. 使用fileuri.getFileUriFromUri将URI转换为文件URI。
  2. 使用fs.open打开转换后的文件URI。

例如:

import fileUri from '@ohos.file.fileuri';
import fs from '@ohos.file.fs';

let fileUri = fileUri.getFileUriFromUri(contentUri);
let file = fs.open(fileUri, fs.OpenMode.READ_ONLY);

这样可以正确打开并操作文件。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!