探秘鸿蒙 HarmonyOS NEXT:大文件下载加速神器

引言

本文章基于HarmonyOS NEXT操作系统,API12以上的版本。

在鸿蒙中如果我们想实现一个上传下载的功能,第一个想到的就是 @ohos.request (上传下载)API,因为这是华为官方文档中在数据文件处理力推的,然而我们在实际工作开发当中,总是会有意想不到的事情发生,比如说,我们要下载一个mp4的文件,按着request使用步骤来,结果:报错!这到底是为什么呢?我明明下载一张图片地址到本地就没有问题,或者刚刚我下载的那个mp4地址就没有问题,为什么这个文件就不行呢?带着疑问,我们开启今天的学习之旅。

有问题就要解决,那我们就查资料,查文档,看看为什么有一些文件地址会下载,再通过浏览论坛偶然间发现,有这样一段话,如下图:

接下来,我果断将刚才下载失败的mp4地址放到浏览器里进行下载,查看视频文件大小,40M,恍然大悟,问题就在这里了,那么回过头来,我们在来看看 requestInStream 是个什么玩意。

原来在 HarmonyOS NEXT操作系统 中,requestInStream API 提供了一种高效的流式 HTTP 请求方式,适用于需要逐步接收和处理大数据的场景,如文件下载、视频流播放等。本篇文章将从 requestInStream 的基本概念、API 介绍、使用方式、代码示例等方面进行详细解析。

requestInStream API 概念

requestInStream 允许应用程序在获取 HTTP 响应数据时,逐步处理数据流,而不是等待整个数据下载完成后再进行处理。这在下载大文件或流式数据时尤为重要,可以节省内存并提高响应速度。

API 介绍

1. requestInStream 方法

根据URL地址,发起HTTP网络请求并返回流式响应,使用Promise方式作为异步方法。

typescript 复制代码
requestInStream(url: string, options? : HttpRequestOptions): Promise<number>
  • url:请求的目标 URL。
  • options:包含请求方法、请求头等参数的对象。
  • 返回值:返回一个 Promise<number>,表示 HTTP 响应状态码。

2. 事件回调

  • headersReceive:接收到 HTTP 头部时触发。
  • dataReceive:接收到部分数据时触发。
  • dataEnd:数据接收完毕时触发。
  • dataReceiveProgress:定期触发,提供下载进度。

使用方式

1. 创建 HTTP 请求对象

typescript 复制代码
import { http } from '@ohos.net.http';
const httpRequest = http.createHttp();

2. 监听事件

typescript 复制代码
httpRequest.on('headersReceive', (header) => {
    console.info('Received Headers:', JSON.stringify(header));
});

httpRequest.on('dataReceive', (data) => {
    console.info('Received Data:', data.byteLength, 'bytes');
});

httpRequest.on('dataEnd', () => {
    console.info('Download completed.');
});

httpRequest.on('dataReceiveProgress', (progress) => {
    console.info(`Progress: ${progress.receiveSize}/${progress.totalSize}`);
});

3. 发送流式请求

typescript 复制代码
httpRequest.requestInStream('https://example.com/file.mp4', {
    method: http.RequestMethod.GET,
    header: { 'User-Agent': 'ArkTS-Downloader' },
}).then((responseCode) => {
    console.info('Request completed with response code:', responseCode);
}).catch((err) => {
    console.error('Request failed:', JSON.stringify(err));
});

代码示例:下载 MP4 文件

以下是一个完整的 requestInStream 示例,用于下载 MP4 视频并存储到本地文件系统。

typescript 复制代码
import { http } from '@ohos.net.http';
import { file } from '@ohos.file.fs';

const VIDEO_URL = 'https://example.com/video.mp4'; // 替换为实际的视频URL
const SAVE_PATH = '/storage/emulated/0/Download/video.mp4';

function downloadVideo() {
    const httpRequest = http.createHttp();
    let fileHandle;
    let receivedSize = 0;

    try {
        fileHandle = file.open(SAVE_PATH, file.OpenMode.CREATE | file.OpenMode.WRITE);
    } catch (err) {
        console.error('Failed to open file:', JSON.stringify(err));
        return;
    }

    httpRequest.on('headersReceive', (header) => {
        console.info('Received Headers:', JSON.stringify(header));
    });

    httpRequest.on('dataReceive', (data) => {
        try {
            file.write(fileHandle, data);
            receivedSize += data.byteLength;
            console.info(`Downloaded: ${receivedSize} bytes`);
        } catch (err) {
            console.error('Write error:', JSON.stringify(err));
        }
    });

    httpRequest.on('dataEnd', () => {
        console.info('Download completed.');
        file.close(fileHandle);
        httpRequest.destroy();
    });

    httpRequest.on('dataReceiveProgress', (progress) => {
        console.info(`Progress: ${progress.receiveSize}/${progress.totalSize}`);
    });

    httpRequest.requestInStream(VIDEO_URL, {
        method: http.RequestMethod.GET,
        header: { 'User-Agent': 'ArkTS-Downloader' },
    }).then((responseCode) => {
        console.info('Request completed with response code:', responseCode);
    }).catch((err) => {
        console.error('Request failed:', JSON.stringify(err));
        file.close(fileHandle);
        httpRequest.destroy();
    });
}

总结

本文详细介绍了 ArkTS 中 requestInStream API 的概念、使用方式,并通过一个完整的 MP4 下载示例演示了其应用。该 API 适用于流式数据处理,如文件下载、音视频播放等场景,有助于优化内存占用,提高应用响应速度。在实际开发中,可以根据业务需求,结合 requestInStream 进行高效的数据传输处理。

相关推荐
eric*168813 小时前
20分钟跑通流程:鸿蒙 Module 发布 OpenHarmony 实战(附完整配置)
华为·harmonyos
廖松洋(Alina)13 小时前
10项目总结与优化方向-鸿蒙PC端Electron开发
华为·electron·开源·harmonyos·鸿蒙
坚果派·白晓明14 小时前
【鸿蒙PC三方库移植适配框架解读系列】第七篇:快速参考与模板
华为·harmonyos·鸿蒙·c/c++三方库·c/c++三方库适配
特立独行的猫a15 小时前
鸿蒙 PC 命令行工具迁移实战 · 内部课件(详细配套版)
华为·harmonyos·移植·鸿蒙pc
廖松洋(Alina)16 小时前
04极速划词页面实现-鸿蒙PC端Electron开发
华为·electron·开源·harmonyos·鸿蒙
轻口味16 小时前
HarmonyOS 6.1 全栈实战录 - 07 极速连接:Remote Communication Kit (RCP) 实战与认证挑战深度解析
华为·harmonyos
想你依然心痛16 小时前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与Face AR & Body AR的“灵犀康养“——PC端沉浸式AR智能康复训练系统
华为·ar·harmonyos·悬浮导航·沉浸光感
廖松洋(Alina)17 小时前
03主入口页面与导航结构-鸿蒙PC端Electron开发
前端·javascript·华为·electron·开源·harmonyos·鸿蒙
廖松洋(Alina)17 小时前
09词根分解与水印展示-鸿蒙PC端Electron开发
前端·javascript·华为·electron·开源·harmonyos·鸿蒙
音视频牛哥17 小时前
大牛直播SDK(SmartMediaKit)鸿蒙NEXT同屏RTMP推流与轻量级RTSP服务集成实践指南
华为·harmonyos·大牛直播sdk·鸿蒙next无纸化同屏·鸿蒙next rtmp推流·鸿蒙next rtsp服务器·鸿蒙next无纸化会议