在日常开发中,文件下载是一个非常常见的业务场景。无论是从远程服务器获取资源,还是将用户生成的内容保存到本地,文件下载功能都是不可或缺的。本文将详细介绍如何实现文件下载功能,并深入解析相关的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
模块提供了文件选择和保存的能力。本文使用 DocumentSaveOptions
和 DocumentViewPicker
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
模块,开发者可以轻松实现文件下载功能,并根据需求灵活调整文件保存路径。希望本文能够帮助开发者更好地理解和掌握文件下载的相关技术,提升开发效率。