HarmonyOS 鸿蒙Next中网络下载的图片音频数据怎么保存到沙箱?
HarmonyOS 鸿蒙Next中网络下载的图片音频数据怎么保存到沙箱?
//获取跟文件路径
let filesDir = getContext(this).filesDir
let filePath = filesDir + "/1.png";
//获取数据
const httpRequest = http.createHttp()
httpRequest.request("http://此处是我电脑IP:8080/static/images/1.png",
{method:http.RequestMethod.GET}, (err: Error, data: http.HttpResponse) => {
if (err) {
console.log('请求失败')
}
console.log('请求成功' + `${typeof data.result}`)
console.log('result 是否 ArrayBuffer:', data.result instanceof ArrayBuffer);
console.log('byteLength:', (data.result as ArrayBuffer).byteLength);
//确定要写入的数据
let writeData = new Uint8Array(data.result as ArrayBuffer);
try {
let fdObj = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.WRITE_ONLY);
let writeLen = fs.writeSync(fdObj.fd, writeData);
console.info("write data to file succeed and size is:" + writeLen);
fs.closeSync(fdObj);
console.log('写入完成');
} catch(e) {
console.error('写文件出错', e);
}
})
以上代码网络请求获取数据没问题,但是在写入的时候就报错提示 写文件出错 Error: Invalid argument
请教一下大佬这个问题该怎么解决???
更多关于HarmonyOS 鸿蒙Next中网络下载的图片音频数据怎么保存到沙箱?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
第一步建议楼主打印完整路径看一下有没特殊字符或拼接错误:
let filesDir = getContext(this).filesDir;
console.info(`沙箱路径有效性:${filesDir}`);
如果你的目标路径包含多级目录要先创建父目录:
import fs from '@kit.CoreFileKit';
// 创建父目录(若路径不含子目录就可以跳过)
let parentDir = filesDir + "/images";
fs.mkdirSync(parentDir, fs.Mode.READ_WRITE);
使用READ_WRITE模式替代WRITE_ONLY:
let fdObj = fs.openSync(
filePath,
fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE // 修正这里
);
代码修正示例:
// 获取沙箱目录
let context = getContext(this);
let filesDir = context.filesDir;
let filePath = filesDir + "/1.png";
const httpRequest = http.createHttp();
httpRequest.request("http://此处替换为实际URL",
{ method: http.RequestMethod.GET },
(err: Error, data: http.HttpResponse) => {
if (err) {
console.error('请求失败', err);
return;
}
let result = data.result as ArrayBuffer;
console.log('result byteLength:', result.byteLength);
try {
// 确保目录存在
// let parentDir = filePath.substring(0, filePath.lastIndexOf('/'));
// fs.mkdirSync(parentDir, fs.Mode.READ_WRITE);
// 打开文件并写入
let fd = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
let writeData = new Uint8Array(result);
fs.writeSync(fd.fd, writeData.buffer, { position: 0 });
fs.closeSync(fd);
console.log('写入成功');
} catch (e) {
console.error('文件操作异常:', e);
}
}
);
更多关于HarmonyOS 鸿蒙Next中网络下载的图片音频数据怎么保存到沙箱?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
文件路径非法或资源未正确引用以及沙箱路径权限不足
已经解决了
在HarmonyOS Next中,使用@ohos.file.fs
模块将网络下载的图片或音频数据保存到应用沙箱。通过fs.createStream()
创建可写流,使用fetch
获取网络数据后,通过流式写入到沙箱路径(如context.filesDir + '/filename'
)。需申请ohos.permission.INTERNET
和ohos.permission.WRITE_MEDIA
权限。
在HarmonyOS Next中,写入文件时出现"Invalid argument"错误通常是由于文件路径或数据格式问题导致的。建议检查以下几点:
- 确保文件路径正确,可以使用
fs.accessSync(filePath)
验证路径有效性 - 确认写入的数据格式,网络返回的ArrayBuffer可能需要转换为Uint8Array
- 检查文件操作权限,确保应用有写入沙箱目录的权限
可以尝试使用以下修改:
let writeData = new Uint8Array(data.result as ArrayBuffer);
let fdObj = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
fs.writeSync(fdObj.fd, writeData.buffer);
fs.closeSync(fdObj);
将写入模式改为READ_WRITE,并直接使用writeData.buffer进行写入。