您的位置:首页 > 财经 > 金融 > 【HarmonyOS NEXT】鸿蒙应用文件上传下载(ohos.request)

【HarmonyOS NEXT】鸿蒙应用文件上传下载(ohos.request)

2024/12/23 9:14:34 来源:https://blog.csdn.net/wu1004019946/article/details/140171994  浏览:    关键词:【HarmonyOS NEXT】鸿蒙应用文件上传下载(ohos.request)

应用可以将应用文件上传到网络服务器,也可以从网络服务器下载网络资源文件到本地应用文件目录。

上传应用文件

开发者可以使用上传下载模块(ohos.request)的上传接口将本地文件上传。文件上传过程使用系统服务代理完成, 在api12中request.agent.create接口增加了设置代理地址参数,支持用户设置自定义代理地址。

说明

当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。

使用上传下载模块,需声明权限
:ohos.permission.INTERNET。

以下示例代码演示两种将应用缓存文件路径下的文件上传至网络服务器的方式:

// 方式一:request.uploadFile
// pages/xxx.ets
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
// pages/xxx.ets
// 将网络资源文件下载到应用文件目录并读取一段内容
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
// pages/xxx.ets
// 将网络资源文件下载到应用文件目录并读取一段内容
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}`;
});

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com