HarmonyOS鸿蒙Next中使用RCP下载文件,如何控制调用writeSync时传入的ArrayBuffer的长度以实现下载限速功能

HarmonyOS鸿蒙Next中使用RCP下载文件,如何控制调用writeSync时传入的ArrayBuffer的长度以实现下载限速功能

export function getContentLength(url: string): Promise<number> {
  const session = rcp.createSession(sessionConfiguration);
  return session.head(url).then(res => {
    const contentLength = res.headers['content-length'];
    return contentLength ? Number(contentLength) : 0;
  }).finally(() => {
    session.close();
  });
}

export async function start(url: string, filePath: string,onProgress: (nowFileSize: number, contentLength: number, progressValue: number) => void) {
  //head请求获取文件大小
  let contentLength = await getContentLength(url)
  const file = fileIo.openSync(filePath, fileIo.OpenMode.WRITE_ONLY | fileIo.OpenMode.CREATE);
  let nowFileSize = await fileIo.statSync(file.fd).size;
  onProgress(nowFileSize, contentLength, Number((nowFileSize / contentLength * 100).toFixed(2)));
  
  const writeSync = (arrayBuffer: ArrayBuffer) => {
    fileIo.writeSync(file.fd, arrayBuffer, { offset: nowFileSize }) //写入文件
    nowFileSize = fileIo.statSync(file.fd).size; //写入完成,修改当前文件大小
    const progressValue = Number((nowFileSize / contentLength * 100).toFixed(2)); //并将结果保留两位小数
    onProgress(nowFileSize, contentLength, progressValue); //通知下载进度
  }

  const session = rcp.createSession(sessionConfiguration);
  const request = new rcp.Request(url, `GET`);
  request.transferRange = { from: nowFileSize };//请求体了Range参数,从当前位置开始下载
  request.destination = {
    kind: 'stream',
    stream: { writeSync }
  };
  session.fetch(request).then((response) => {
  },()=>{
    console.log(`aaa`,'Download 下载失败响应异常.');
  }).finally(() => {
    session.close();
    fileIo.close(file)
  });
}

使用RCP下载文件,要实现下载限速功能,如何控制调用writeSync时传入的ArrayBuffer的长度. 华为有提供相关的API吗?


更多关于HarmonyOS鸿蒙Next中使用RCP下载文件,如何控制调用writeSync时传入的ArrayBuffer的长度以实现下载限速功能的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

您好,当前系统能力暂不支持下载限速能力,正在规划中,请关注后续版本迭代。

关于“如何控制调用writeSync时传入的ArrayBuffer的长度”这块属于业务性逻辑,需要通过获取时间戳、数据流大小,进行业务处理限制。

更多关于HarmonyOS鸿蒙Next中使用RCP下载文件,如何控制调用writeSync时传入的ArrayBuffer的长度以实现下载限速功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


好的,还有个问题writeSync方法会高频率调用, 该方法为同步方法,指南文档中的demo也是这么写的,既然是同步的,不会造成现成阻塞吗

在HarmonyOS鸿蒙Next中,使用RCP下载文件时,可以通过控制writeSync方法传入的ArrayBuffer的长度来实现下载限速。具体步骤如下:

  1. 计算限速值:根据所需的下载速度(如100KB/s),计算每次写入的数据块大小。例如,若每秒调用10次writeSync,则每次写入的数据块大小为10KB。

  2. 分块写入:在读取数据时,将数据分块为指定大小(如10KB),然后调用writeSync写入。

  3. 控制频率:通过setTimeoutsetInterval控制writeSync的调用频率,确保每秒写入的数据总量不超过限速值。

  4. 动态调整:根据实际网络状况动态调整数据块大小和调用频率,以更精确地控制下载速度。

通过以上方法,可以有效实现下载限速功能。

回到顶部