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

5 回复

第一步建议楼主打印完整路径看一下有没特殊字符或拼接错误:

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.INTERNETohos.permission.WRITE_MEDIA权限。

在HarmonyOS Next中,写入文件时出现"Invalid argument"错误通常是由于文件路径或数据格式问题导致的。建议检查以下几点:

  1. 确保文件路径正确,可以使用fs.accessSync(filePath)验证路径有效性
  2. 确认写入的数据格式,网络返回的ArrayBuffer可能需要转换为Uint8Array
  3. 检查文件操作权限,确保应用有写入沙箱目录的权限

可以尝试使用以下修改:

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进行写入。

回到顶部