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
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转换环节。建议检查以下几点:
- 确保fileUri模块已正确导入:
import fileUri from '@ohos.file.fileUri';
- 当前路径转换方式在Next版本可能需要调整,可以尝试:
let uri = fileUri.getUriFromPath(filePath).toString();
- 或者使用新的URI构造方式:
let uri = 'file://' + filePath;
- 检查filesDir路径是否正确,可以先用console.log输出filePath验证路径格式
手表端使用file.writeText确实需要注意URI格式兼容性。建议先在模拟器上测试确认URI格式是否正确,再适配手表环境。