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 模块,开发者可以轻松实现文件下载功能,并根据需求灵活调整文件保存路径。希望本文能够帮助开发者更好地理解和掌握文件下载的相关技术,提升开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE_C++ —— Gameplay Tags

目录 一,Defining Gameplay Tags Adding Tags in Project Settings Importing Tags from Data Table Assets Defining Tags with C 二,Using Defined Gameplay Tags Applying Tags to Objects Evaluating Tags with Conditional Functions 三&am…

计算机视觉算法实战——三维重建(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 三维重建领域简介 三维重建(3D Reconstruction)是计算机视觉的核心任务之一,旨在通过多视角图像、视频…

Spring5框架八:整合Mybatis

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 1、导入相关的jar包 <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>…

AI学习第一天-什么是AI

AI的发展可以被分为四次浪潮&#xff0c;这包括符号主义、机器学习与神经网络&#xff0c;以及深度学习。在这些发展中&#xff0c;深度学习凭借其在处理非结构化复杂数据、强大的学习能力和可解释性方面的优势备受关注。深度学习技术的应用不仅提升了AI系统的性能&#xff0c;…

redis-bitmap使用场景

bitmap原理 Bitmap&#xff08;位图&#xff09;是一种基于二进制位的数据结构&#xff0c;用于高效地存储和操作大量的布尔值 可以对单个位进行读写操作 demo package org.example;import org.redisson.Redisson; import org.redisson.api.RBitSet; import org.redisson.ap…

华为 网络安全 认证

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 华为 网络安全 认证&#xff1a;保障信息安全的重要一环 在数字化时代的今天&#xff0c;网络安全成为了企业和个人都需要高度重视的问题。尤其是在企业信息化的…

ubuntu22.04连接github无法访问的问题

目录 说明安装 说明 此方案只针对虚拟机, 如果是云服务器(毕竟是官方维护, github还是能访问到的)多试几次肯定能够访问到的. 国内我们无法访问外网, 所以我们目前能够访问外网的途径基本上只能开佳速器. 所以我们需要选择一款加速器来帮助我们访问外网, 目前市面上很多佳速器…

【Research Proposal】基于提示词方法的智能体工具调用研究——难点

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;一、难点分析1. 提示词方法的多样性和组合问题2. 智能体工具调用的准确性和效率问题3. 多模态任务中的复杂性问题 &#x1f4af;二、解决思路与策略&#x1f…

Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg

参考文章&#xff1a; https://blog.csdn.net/whatareyouding/article/details/144317654 https://www.cnblogs.com/Gredae/p/18362900 https://www.cnblogs.com/kn-zheng/p/17422707.html https://blog.51cto.com/u_16099344/10281495 https://www.tulingxueyuan.cn/tlzx/jsp…

智慧教室与无纸化同屏技术方案探讨与实现探究

引言 随着教育信息化的不断发展&#xff0c;智慧教室和无纸化同屏技术逐渐成为提升教学效率和质量的重要手段。大牛直播SDK凭借其强大的音视频处理能力和丰富的功能特性&#xff0c;在智慧教室和无纸化同屏领域积累了众多成功案例。本文将深入探讨基于大牛直播SDK的智慧教室、…

自制操作系统前置知识汇编学习

今天要做什么&#xff1f; 为了更好的理解书中内容&#xff0c;需要学习下进制分析和汇编。 汇编语言其实应该叫叫机器指令符号化语言&#xff0c;目前的汇编语言是学习操作系统的基础。 一&#xff1a;触发器 电路触发器的锁存命令默认是断开的&#xff0c;是控制电路触发器…

嘉立创EDA一自画元件及其封装

目录 一、创建元件 &#xff08;1&#xff09;新建元件。 &#xff08;2&#xff09;绘制元件。 二、绘制封装 &#xff08;1&#xff09;新建封装。 &#xff08;2&#xff09;绘制封装。 三、关联元件与封装 四、封装设计注意事项 在嘉立创&#xff08;JLCPCB&#xff…

《深度学习实战》第2集-补充:卷积神经网络(CNN)与图像分类 实战代码解析和改进

以下是对《深度学习实战》第2集中 CIFAR-10 数据集 使用卷积神经网络进行图像分类实战 代码的详细分析&#xff0c;并增加数据探索环节&#xff0c;同时对数据探索、模型训练和评估的过程进行具体说明。所有代码都附上了运行结果配图&#xff0c;方便对比。 《深度学习实战》第…

dataframe如何在末尾添加多行

如果要在pandas的dataframe中添加多行该如何实现&#xff1f;可通过以下常见方式在DataFrame末尾添加&#xff1a; ### 方法一&#xff1a;使用loc索引器 利用loc索引器分两次操作来添加两行数据。假设已有DataFrame对象df&#xff0c;要添加的两行数据分别存储在字典new_row…

使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流

在现代工作与学习中&#xff0c;可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本&#xff0c;结合 Typora 快速生成流程图和甘特图&#xff0c;并通过 Markdown 格式生成思维导图&#xff0c;最终…

插入排序(详解)c++

插⼊排序(Insertion Sort)类似于玩扑克牌插牌过程&#xff0c;每次将⼀个待排序的元素按照其关键字⼤⼩插⼊到前⾯已排好序的序列中&#xff0c;按照该种⽅式将所有元素全部插⼊完成即可 算法思想&#xff1a; 把待排序元素插入到已排序的序列中。想象一下一张一张整理扑克牌的…

【大模型】蓝耘智算云平台快速部署DeepSeek R1/R3大模型详解

目录 一、前言 二、蓝耘智算平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 应用场景 2.4 对DeepSeek 的支持 2.4.1 DeepSeek 简介 2.4.2 DeepSeek 优势 三、蓝耘智算平台部署DeepSeek-R1操作过程 3.1 注册账号 3.1.1 余额检查 3.2 部署DeepSeek-R1 3.2.1 获取…

ai-financial-agent - 为金融投资打造的AI代理

探索人工智能在投资研究中的应用。本项目仅用于**教育**目的&#xff0c;不用于真实交易或投资。 作者声明&#xff1a; 本项目仅用于教育和研究目的。 不用于真实交易或投资不提供任何保证或担保过去的表现并不代表未来的结果Creator 对经济损失不承担任何责任咨询财务顾问…

基于keepalived的Nginx高可用架构

一、概述 Keepalived 是一个基于 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;协议 的高可用性解决方案&#xff0c;为了解决静态路由器出现的单点故障问题&#xff0c;它能偶保证网络的不间断、稳定的运行。 二、核心功能 IP 漂移&#xff08;VIP&…

学术论文项目网站搭建教程【Github】

本教程使用的是linux系统&#xff0c;ubuntu20.04版本进行学术项目网站搭建 一&#xff1a;创建github的个人组织 我个人习惯使用自己的github组织【Your organizations】来进行学术项目网站的创建&#xff1a; New一个organization&#xff0c;点击Free中的Create a free o…