HarmonyOS 鸿蒙Next中uri illegal求助

HarmonyOS 鸿蒙Next中uri illegal求助 我想在应用沙箱的路径内创建一个txt用于缓存数据,

let context: common.UIAbilityContext = getContext() as common.UIAbilityContext;
// 获取文件沙箱路径
let filePath = context.filesDir + '/test.txt';
// 将沙箱路径转换为uri
let uri = fileUri.getUriFromPath(filePath);

//写入文件(追加模式)
await new Promise<void>((resolve, reject)=> {
  file.writeText({
    uri: uri,
    text: dataStr,
    append: true,
    success: resolve,
    fail: (err) => reject(new Error(`${JSON.stringify(err)}`))
  })
})

(用file.writeText是因为手表端不支持新的api)

但是错误信息一直提示uri illegal,求教是不是我对uri的理解有误


更多关于HarmonyOS 鸿蒙Next中uri illegal求助的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

1. fileUri.getUriFromPath 返回值要检查

getUriFromPath() 会返回一个这样的字符串:

file:///data/storage/el2/base/haps/entry/files/test.txt

2.目录必须存在

旧版 file.writeText 不会帮你自动建目录,如果 /files/ 下没有 test.txt 这个文件,或者上级目录不存在,就会直接 "uri illegal"
所以需要先:

import fileio from '@ohos.fileio'; try { fileio.openSync(filePath, fileio.OpenMode.CREATE | fileio.OpenMode.READ_WRITE); } catch (e) { console.error("文件创建失败", e); }

再去调用 file.writeText

更多关于HarmonyOS 鸿蒙Next中uri illegal求助的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙的文件URI是有特定格式的,你直接使用沙箱路径拼接的字符串可能导致协议头缺失。手动拼接路径很有可能导致格式错误,还是建议使用标准API构建路径。另外使用fileUri.getUriFromPath生成的URI可能未适配鸿蒙的文件访问协议,之前遇到过缺少internal://app/前缀问题。

楼主直接构建标准URI

let uri = 'internal://app/test.txt';

通过Context获取应用沙箱路径

let filePath = context.filesDir + '/test.txt';

// 转换为系统认可的URI格式

let uri = fileUri.getUriFromPath(filePath).replace('file://', 'internal://app/');

使用文件管理API创建路径

import fs from '@kit.CoreFileKit';

// 创建文件并获取合法URI

let file = fs.openSync(context.filesDir + '/test.txt', fs.OpenMode.CREATE);

let uri = 'internal://app/' + file.fd; // 这里楼主根据实际需求调整

在HarmonyOS Next中遇到"uri illegal"错误通常是由于URI格式不符合规范导致的。检查以下几点:1) URI是否包含非法字符或空格;2) 文件路径是否使用了正确的协议前缀如"file://";3) 网络请求是否使用了"https://“或"http://”;4) 参数传递时是否进行了正确的URL编码。确保URI符合RFC 3986标准规范。

在HarmonyOS Next中,URI格式要求较为严格。根据你的代码,问题可能出在URI转换环节。建议检查以下几点:

  1. 确保fileUri模块已正确导入:
import fileUri from '@ohos.file.fileUri';
  1. 当前路径转换方式在Next版本可能需要调整,可以尝试:
let uri = fileUri.getUriFromPath(filePath).toString();
  1. 或者使用新的URI构造方式:
let uri = 'file://' + filePath;
  1. 检查filesDir路径是否正确,可以先用console.log输出filePath验证路径格式

手表端使用file.writeText确实需要注意URI格式兼容性。建议先在模拟器上测试确认URI格式是否正确,再适配手表环境。

回到顶部