HarmonyOS 应用下载网络文件保存到本地公共目录

devtools/2025/2/22 20:07:21/

在日常开发中,文件下载是一个非常常见的业务场景。无论是从远程服务器获取资源,还是将用户生成的内容保存到本地,文件下载功能都是不可或缺的。本文将详细介绍如何实现文件下载功能,并深入解析相关的API使用方法,帮助开发者更好地理解和掌握这一技术。


1. 数据请求:@ohos.net.http 模块

文件下载的第一步是从远程服务器获取文件数据。@ohos.net.http 模块提供了HTTP数据请求的能力,支持常见的HTTP方法,如GET、POST、PUT、DELETE等。在发起HTTP请求之前,必须先创建一个 HttpRequest 实例。每个 HttpRequest 对象对应一个HTTP请求。如果需要发起多个HTTP请求,必须为每个请求创建对应的 HttpRequest 对象。

1.1 发起HTTP请求

通过 http.createHttp().request(url) 方法,可以根据URL地址发起HTTP网络请求。该方法返回一个 HttpResponse 对象,其中包含了服务器返回的状态码、响应头以及响应体等信息。

1.2 获取文件数据

在文件下载场景中,通常使用GET方法请求文件数据。服务器返回的文件数据通常以二进制形式(如 ArrayBuffer)存储在 HttpResponse.result 中。

示例代码
const response: http.HttpResponse = await http.createHttp().request(url);
if (response.responseCode === http.ResponseCode.OK) {const arrayBuffer: ArrayBuffer = response.result as ArrayBuffer;
} else {promptAction.showToast({ message: '文件下载失败' });
}

在上述代码中,我们首先发起HTTP请求,然后检查响应状态码是否为 OK(即200)。如果请求成功,将响应体中的二进制数据存储到 arrayBuffer 中;如果请求失败,则提示用户“文件下载失败”。


2. 文件保存路径选择:@ohos.file.picker 模块

文件下载的第二步是确定文件的保存路径。@ohos.file.picker 模块提供了文件选择和保存的能力。本文使用 DocumentSaveOptionsDocumentViewPicker API 来实现文件保存路径的选择。

2.1 DocumentSaveOptions(文档保存选项)

DocumentSaveOptions 用于配置文件保存的相关选项,例如文件保存的默认路径、文件名、文件后缀等。开发者可以根据需求选择将文件保存到默认的下载目录,或者让用户自定义保存路径。

  • 默认下载目录示例
const documentSaveOptions = new picker.DocumentSaveOptions();
documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD;
  • 用户选择保存目录示例
const documentSaveOptions = new picker.DocumentSaveOptions();
documentSaveOptions.newFileNames = ['文件名'];
documentSaveOptions.fileSuffixChoices = ['文件后缀'];
// 可选配置
documentSaveOptions.defaultFilePathUri = '指定保存的文件或者目录路径';
2.2 DocumentViewPicker(文件选择器对象)

DocumentViewPicker 用于选择和保存各种格式的文档。在使用前,需要先创建 DocumentViewPicker 实例。通过调用 save 方法,可以弹出一个文件保存对话框,让用户选择保存路径。

示例代码
const documentViewPicker = new picker.DocumentViewPicker(context);
// 返回一个URI数组
const documentSaveResult = await documentViewPicker.save(documentSaveOptions);
const downloadUri = documentSaveResult[0];
// 使用fileUri对URI进行转换
const downloadPath = new fileUri.FileUri(downloadUri + '/' + fileName).path;

在上述代码中,我们首先创建了一个 DocumentViewPicker 实例,然后调用 save 方法获取用户选择的保存路径。返回的 downloadUri 是一个URI数组,我们可以通过 fileUri.FileUri 将其转换为文件路径。


3. 文件写入:@ohos.file.fs 模块

文件下载的最后一步是将获取到的文件数据写入本地文件系统。@ohos.file.fs 模块提供了基础的文件操作API,包括文件管理、目录管理、文件信息统计、文件流式读写等功能。

3.1 打开文件

使用 fs.openSync 方法可以以同步方式打开文件。该方法支持使用URI打开文件,并返回一个文件描述符(fd)。

3.2 写入文件

使用 fs.writeSync 方法可以将二进制数据写入文件。该方法需要传入文件描述符和要写入的数据。

3.3 关闭文件

使用 fs.closeSync 方法可以以同步方式关闭文件,释放文件描述符。

示例代码
// 以同步方法打开文件
const file = fs.openSync(downloadPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
// 以同步方法将数据写入文件
fs.writeSync(file.fd, arrayBuffer);
// 以同步方法关闭文件
fs.closeSync(file.fd);

在上述代码中,我们首先打开文件,然后将 arrayBuffer 中的数据写入文件,最后关闭文件。


4. 完整代码示例

以下是一个完整的文件下载功能的实现代码:

async function downloadFile(url: string) {// 从URL中提取文件名const fileName = decodeURIComponent(url.split('/')[url.split('/').length - 1]);let context = getContext() as common.Context;// 发起HTTP请求const response: http.HttpResponse = await http.createHttp().request(url);if (response.responseCode === http.ResponseCode.OK) {const arrayBuffer: ArrayBuffer = response.result as ArrayBuffer;// 用户选择保存位置const documentSaveOptions = new picker.DocumentSaveOptions();documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD;const documentViewPicker = new picker.DocumentViewPicker(context);const documentSaveResult = await documentViewPicker.save(documentSaveOptions);const downloadUri = documentSaveResult[0];const downloadPath = new fileUri.FileUri(downloadUri + '/' + fileName).path;// 将文件写入指定路径const file = fs.openSync(downloadPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);fs.writeSync(file.fd, arrayBuffer);fs.closeSync(file.fd);promptAction.showToast({ message: '文件下载成功' });} else {promptAction.showToast({ message: '文件下载失败' });}
}

5. 总结

本文详细介绍了文件下载功能的实现流程,涵盖了从数据请求、文件保存路径选择到文件写入的完整步骤。通过使用 @ohos.net.http@ohos.file.picker@ohos.file.fs 模块,开发者可以轻松实现文件下载功能,并根据需求灵活调整文件保存路径。希望本文能够帮助开发者更好地理解和掌握文件下载的相关技术,提升开发效率。


http://www.ppmy.cn/devtools/161016.html

相关文章

[C++]使用纯opencv部署yolov12目标检测onnx模型

yolov12官方框架:sunsmarterjie/yolov12 【算法介绍】 在C中使用纯OpenCV部署YOLOv12进行目标检测是一项具有挑战性的任务,因为YOLOv12通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff…

cuda安装

cuda WSL2急速搭建CUDA体验环境_wsl2 cuda-CSDN博客 cudnn cuDNN Archive | NVIDIA Developer pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

PyTorch 源码学习:阅读经验 代码结构

分享自己在学习 PyTorch 源码时阅读过的资料。本文重点关注阅读 PyTorch 源码的经验和 PyTorch 的代码结构。因为 PyTorch 不同版本的源码实现有所不同,所以笔者在整理资料时尽可能按版本号升序,版本号见标题前[]。最新版本的源码实现还请查看 PyTorch 仓…

Docker安装Quickwit搜索引擎

介绍 Quickwit 是首个以亚秒级延迟直接在云存储上执行复杂搜索和分析查询的引擎。它由 Rust 及其分离的计算和存储架构提供支持,旨在节省资源、易于操作并可扩展到 PB 级数据。 Quickwit 非常适合日志管理、分布式跟踪以及通常不可变的数据(例如对话数…

本地部署DeepSeek的硬件配置建议

本地部署DeepSeek的硬件配置需求因模型参数规模和部署工具不同而有所差异,以下是综合多个来源的详细要求: 1. 基础配置(适用于7B参数模型) 内存:最低8GB,推荐16GB及以上;若使用Ollama工具&…

Datawhale Ollama教程笔记5

Dify 接入 Ollama 部署的本地模型 Dify 支持接入 Ollama 部署的大型语言模型推理和 embedding 能力。 快速接入 下载 Ollama 访问 Ollama 安装与配置,查看 Ollama 本地部署教程。 运行 Ollama 并与 Llama 聊天 ollama run llama3.1Copy to clipboardErrorCopied …

安装海康威视相机SDK后,catkin_make其他项目时,出现“libusb_set_option”错误的解决方法

硬件:雷神MIX G139H047LD 工控机 系统:ubuntu20.04 之前运行某项目时,处于正常状态。后来由于要使用海康威视工业相机(型号:MV-CA013-21UC),便下载了并安装了该相机的SDK,之后运行…

go WEB框架

推荐选型 https://chat.deepseek.com/a/chat/s/e6061607-8f33-4768-a5f0-8970cb1ffefd echo github:https://github.com/labstack/echo wiki:https://echo.labstack.com/docs/quick-start block:https://blog.csdn.net/qq_38105536/artic…