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

在日常开发中,文件下载是一个非常常见的业务场景。无论是从远程服务器获取资源,还是将用户生成的内容保存到本地,文件下载功能都是不可或缺的。本文将详细介绍如何实现文件下载功能,并深入解析相关的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.rhkb.cn/news/21974.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 视图(View)

Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号,都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…

蓝桥杯刷题2.21|笔记

参考的是蓝桥云课十四天的那个题单&#xff0c;不知道我发这个有没有问题&#xff0c;如果有问题找我我立马删文。&#xff08;参考蓝桥云课里边的题单&#xff0c;跟着大佬走&#xff0c;应该是没错滴&#xff0c;加油加油&#xff09; 一、握手问题 #include <iostream&g…

从零开始学习PX4源码9(部署px4源码到gitee)

目录 文章目录 目录摘要1.gitee上创建仓库1.1 gitee上创建仓库PX4代码仓库1.2 gitee上创建子仓库2.固件在gitee部署过程2.1下载固件到本地2.2切换本地分支2.3修改.gitmodules内容2.4同步子模块仓库地址2.5同步子模块仓库地址更新(下载)子模块3.一级子模块和二级子模块的映射关…

微服务SpringCloudAlibaba组件sentinel教程【详解sentinel的使用以及流量控制、熔断降级、热点参数限流等,附有示例+代码】

文章目录 四.Sentinel限流熔断4.1 sentinel介绍4.2 Sentinel 的历史4.3 Sentinel 基本概念资源规则 4.4 Sentinel 功能和设计理念4.4.1 流量控制4.4.2熔断降级什么是熔断降级熔断降级设计理念系统负载保护 4.5 Sentinel 是如何工作的4.6 Sentinel使用4.7 Sentinel 控制台4.8 Sp…

webmin配置终端显示样式,模仿UbuntuDesktop终端

webmin配置终端显示样式&#xff0c;模仿UbuntuDesktop终端 在webmin中&#xff0c;默认情况下是没有图形化桌面的&#xff0c;因此终端界面也不会像 Ubuntu Desktop 那样有预设的紫色背景和颜色主题。不过&#xff0c;你可以通过修改 ~/.bashrc 文件&#xff0c;并结合安装和…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…

AWS-SAA中文版题库

一家公司收集多大洲城市的温度、湿度和大气压数据。该公司每天从每个站点收集的平均数据量为500GB。每个站点都有高速互联网连接。该公司希望尽快将所有这些全球站点的数据聚合到一个AmazonS3存储桶中。解决方案必须将操作复杂性降至最低。哪种解决方案满足这些要求&#xff1f…

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/&#xff0c;登录个人账号&#xff0c;右上角加号…

微相E316实现FM电台监听

前面介绍了基于Matlab、矢量信号器或微相E316、HackRF One实现AM和FM调制解调&#xff0c;今天分享的内容是用微相E316、上位机和Matlab实现FM电台信号监听。注意本文仅用于科研和学习&#xff0c;私自搭建电台属于违法行为。 1.概述 微相E316、上位机和Matlab实现FM电台信号…

【总结】GraphRAG与传统RAG的深度对比及主流项目分析

GraphRAG和传统RAG的区别 GraphRAG和传统RAG都是为了增强大语言模型&#xff08;LLMs&#xff09;在特定领域的能力而发展出的技术&#xff0c;但它们在多个方面存在明显区别。 1. 知识组织方式 传统RAG&#xff1a;通常将大规模文本语料库分割成文本块&#xff0c;再利用嵌入…

SessionBox同一浏览器登录多账号独立IP教程

对于多账号运营的跨境营销人员来说&#xff0c;SessionBox提供了同一浏览器登录多账号的解决方案&#xff0c;但是很多人不仅需要多账号登录&#xff0c;对于登录Facebook、Instagram等账号来说&#xff0c;如何SessionBox与代理配合使用以确保真正的帐户分离更为重要&#xff…

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题&#xff0c;分为使用BFS和使用迪斯科特拉算法&#xff0c;这两种算法求解的范围是有区别的 BFS适合求解&#xff0c;边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…

ubuntu ffmpeg 安装踩坑

ffmpeg 安装踩坑 安装命令: sudo apt update sudo apt install ffmpeg如果以上命令没有报错&#xff0c;那么恭喜你很幸运&#xff0c;可以关闭这篇文章了&#xff01; 如果跟我一样&#xff0c;遇到如下报错&#xff0c;可以接着往下看&#xff1a; 报错信息&#xff1a; …

如何通过Windows环境远程控制MusicGPT在线生成高质量AI音乐

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 在这个快节奏的时代&#xff0c;音乐不仅是心灵的慰藉&#xff0c;更是创意的源泉。试想一下&#xff0c;在忙碌的工作间隙或悠闲的周末午后&#xff0c;只需轻敲几行…

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)

Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义参考&#xff1a; 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等参考&#xff1a; 大数据组件(四)快速入门实时数据…

Spring面试题2

1、compareable和compactor区别 定义与包位置:Comparable是一个接口&#xff0c;位于java.lang包,需要类去实现接口&#xff1b;而Compactor是一个外部比较器&#xff0c;位于java.util包 用法&#xff1a;Comparable只需要实现int compareTo(T o) 方法&#xff0c;比较当前对…

react(9)-redux

使用CRA快速创建react项目 npx create-react-app react-redux 安装配套工具 npm i reduxjs/toolkit react-redux 启动项目 在创建项目时候会出现一个问题 You are running create-react-app 5.0.0, which is behind the latest release (5.0.1). We no longer support…

HTTP SSE 实现

参考&#xff1a; SSE协议 SSE技术详解&#xff1a;使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为&#xff1a;服务端和客户端建立连接之后双方均保持连接&#xff0c;但仅支持服务端向客户端推送数据。推送完毕之后关闭连接&#xff0c;无状态行。 下面是基于…

STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(二)

目录 一、B2121 最长最短单词 - 洛谷 算法代码&#xff1a; 代码分析 变量定义 输入处理 单词长度计算 更新最长和最短单词的长度 输出最长单词 输出最短单词 评测记录&#xff1a;​编辑 二、B2122 单词翻转 - 洛谷 算法代码&#xff1a; 代码分析 引入头文件和定…