【鸿蒙实现文件上传下载】
鸿蒙系统支持文件上传下载功能,开发者可通过ohos.request模块实现本地文件上传和网络资源下载。上传仅支持应用缓存目录文件,下载则保存至应用文件目录。API12新增代理地址设置功能。两种方式均需声明INTERNET权限:上传示例展示uploadFile和agent.create两种方法;下载示例演示downloadFile和agent.create两种实现,下载后可读取文件内容。代码示例包含
鸿蒙实现文件上传下载
前言:
我们将在鸿蒙系统(HarmonyOS)上实现一个上传下载方案。我们将使用鸿蒙的网络管理和文件管理能力。
由于鸿蒙提供了HTTP网络请求的能力和文件管理的能力,我们可以通过以下步骤实现:
- 上传:选择本地文件,通过HTTP POST请求将文件数据发送到服务器。
- 下载:通过HTTP GET请求从服务器获取文件,并保存到本地。
一、上传应用文件
开发者可以使用上传下载模块(ohos.request)的上传接口将本地文件上传。文件上传过程使用系统服务代理完成, 在api12中request.agent.create接口增加了设置代理地址参数,支持用户设置自定义代理地址。
说明: 当前上传应用文件功能,仅支持上传应用缓存文件路径(
cacheDir)下的文件。
使用上传下载模块,需声明权限:ohos.permission.INTERNET。
以下示例代码演示两种将应用缓存文件路径下的文件上传至网络服务器的方式:
方式一:request.uploadFile
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import request from '@ohos.request';
import { BusinessError } from '@ohos.base';
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;
// 新建一个本地应用文件
let file = fs.openSync(cacheDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, 'upload file test');
fs.closeSync(file);
// 上传任务配置项
let header = new Map<Object, string>();
header.set('key1', 'value1');
header.set('key2', 'value2');
let files: Array<request.File> = [
//uri前缀internal://cache 对应cacheDir目录
{ filename: 'test.txt', name: 'test', uri: 'internal://cache/test.txt', type: 'txt' }
]
let data: Array<request.RequestData> = [{ name: 'name', value: 'value' }];
let uploadConfig: request.UploadConfig = {
url: 'https://xxx',
header: header,
method: 'POST',
files: files,
data: data
}
// 将本地应用文件上传至网络服务器
try {
request.uploadFile(context, uploadConfig)
.then((uploadTask: request.UploadTask) => {
uploadTask.on('complete', (taskStates: Array<request.TaskState>) => {
for (let i = 0; i < taskStates.length; i++) {
console.info(`upload complete taskState: ${JSON.stringify(taskStates[i])}`);
}
});
})
.catch((err: BusinessError) => {
console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
})
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
}
方式二:request.agent
获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;
新建一个本地应用文件
let file = fs.openSync(cacheDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, 'upload file test');
fs.closeSync(file);
let attachments: Array<request.agent.FormItem> = [{
name: "test",
value: [
{
filename: "test.txt",
path: "./test.txt",
},
]
}];
let config: request.agent.Config = {
action: request.agent.Action.UPLOAD,
url: 'http://xxx',
mode: request.agent.Mode.FOREGROUND,
overwrite: true,
method: "POST",
data: attachments,
saveas: "./"
};
request.agent.create(getContext(), config).then((task: request.agent.Task) => {
task.start((err: BusinessError) => {
if (err) {
this.progress = `Failed to start the upload task, Code: ${err.code} message: ${err.message}`;
return;
}
});
task.on('progress', async(progress) => {
console.warn(`/Request upload status ${progress.state}, uploaded ${progress.processed}`);
})
task.on('completed', async() => {
console.warn(`/Request upload completed`);
})
}).catch((err: BusinessError) => {
this.progress = `Failed to create a upload task, Code: ${err.code}, message: ${err.message}`;
});
二、下载网络资源文件至应用文件目录
开发者可以使用上传下载模块(ohos.request)的下载接口将网络资源文件下载到应用文件目录。对已下载的网络资源文件,开发者可以使用基础文件IO接口(ohos.file.fs)对其进行访问,使用方式与应用文件访问一致。文件下载过程使用系统服务代理完成, 在api12中request.agent.create接口增加了设置代理地址参数,支持用户设置自定义代理地址。
说明:
当前网络资源文件仅支持下载至应用文件目录。
使用上传下载模块,需声明权限:ohos.permission.INTERNET。
以下示例代码演示两种将网络资源文件下载到应用文件目录的方式:
方式一:request.downloadFile
将网络资源文件下载到应用文件目录并读取一段内容
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import request from '@ohos.request';
import { BusinessError } from '@ohos.base';
import buffer from '@ohos.buffer';
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
try {
request.downloadFile(context, {
url: 'https://xxxx/xxxx.txt',
filePath: filesDir + '/xxxx.txt'
}).then((downloadTask: request.DownloadTask) => {
downloadTask.on('complete', () => {
console.info('download complete');
let file = fs.openSync(filesDir + '/xxxx.txt', fs.OpenMode.READ_WRITE);
let arrayBuffer = new ArrayBuffer(1024);
let readLen = fs.readSync(file.fd, arrayBuffer);
let buf = buffer.from(arrayBuffer, 0, readLen);
console.info(`The content of file: ${buf.toString()}`);
fs.closeSync(file);
})
}).catch((err: BusinessError) => {
console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
}
方式二:request.agent
将网络资源文件下载到应用文件目录并读取一段内容
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import request from '@ohos.request';
import { BusinessError } from '@ohos.base';
import buffer from '@ohos.buffer';
let config: request.agent.Config = {
action: request.agent.Action.DOWNLOAD,
url: 'https://xxxx/test.txt',
gauge: true,
overwrite: true,
network: request.agent.Network.WIFI,
};
request.agent.create(getContext(), config).then((task: request.agent.Task) => {
task.start((err: BusinessError) => {
if (err) {
this.progress = `Failed to start the upload task, Code: ${err.code} message: ${err.message}`;
return;
}
});
task.on('progress', async(progress) => {
console.warn(`/Request download status ${progress.state}, downloaded ${progress.processed}`);
})
task.on('completed', async() => {
console.warn(`/Request download completed`);
})
}).catch((err: BusinessError) => {
this.progress = `Failed to create a download task, Code: ${err.code}, message: ${err.message}`;
});
三、注意事项
- 权限申请:确保在应用首次启动时动态申请必要的权限
- 大文件处理:对于大文件,建议使用流式处理,避免内存溢出
- 后台下载:需要长时间下载的任务应考虑使用后台服务
- 安全传输:敏感文件上传应使用HTTPS并考虑加密
- 存储空间:下载前检查设备存储空间
- 网络切换:监听网络变化,在网络恢复时继续任务
更多推荐

所有评论(0)