OpenHarmony开发者论坛

标题: OpenHarmony应用如何上传下载文件 [打印本页]

作者: 深开鸿_石悌君    时间: 2023-12-18 11:02
标题: OpenHarmony应用如何上传下载文件
[md]### 简介:

使用[@ohos.request](https://gitee.com/openharmony/do ... /js-apis-request.md)接口创建上传和下载任务,实现上传、下载功能

### 文档环境:

* 开发环境:Windows 10家庭版
* DevEco Studio版本:DevEco Studio 4.0Release (4.0.0.600)
* SDK版本:4.0.10.13 (full sdk)
* API版本:Version 10
* 开发板型号:DAYU200(RK3568)
* 系统版本:OpenHarmony 4.1.2.2

### 演示demo:

* 设置request.agent.Config类型的上传/下载任务的配置信息:action和url是必选配置,action值为request.agent.Action.UPLOAD和request.agent.Action.DOWNLOAD,url值为资源地址
* 通过 let context = getContext(this) as common.UIAbilityContext并使用request.agent.create(context, config)创建上传或下载任务
* 通过on(‘progress’)订阅任务进度的事件,可以得到已上传/下载的字节数,app自定义算法显示上传下载进度比例显示在用户界面
* 通过on(‘completed’)订阅任务完成事件,on(‘failed’)订阅任务失败事件
* 上述准备工作完成后,调用Task的start函数开始文件上传下载
* 上传/下载演示界面如图

| 上传 | 下载|
| --- | --- |
|![upload.jpg](https://forums-obs.openharmony.c ... ify2m8129mb1cjp.jpg "upload.jpg")|![download.jpg](https://forums-obs.openharmony.c ... q4dtzdd0nh4q04v.jpg "download.jpg")|

* 上传文件核心代码如下

```
import common from '@ohos.app.ability.common';
import request from '@ohos.request';
import promptAction from '@ohos.promptAction';

class Upload {
  async uploadFile(fileUris: Array<string>, begin: number, end: number, callback: (progress: number, isSucceed: boolean) => void): Promise<void> {
    // 查询到存在正在执行的上传任务,提示并返回
    let tasks = await request.agent.search({
      state: request.agent.State.RUNNING,
      action: request.agent.Action.UPLOAD,
      mode: request.agent.Mode.FOREGROUND
    });
    if (tasks.length > 0) {
      promptAction.showToast({ message: $r('app.string.have_upload_task_tips'), bottom: TOAST_BOTTOM });
      return;
    }
    let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    let config: request.agent.Config = {
      action: request.agent.Action.UPLOAD,
      headers: HEADER,
      url: await urlUtils.getUrl(context),
      mode: request.agent.Mode.FOREGROUND,
      method: 'POST',
      title: 'upload',
      network: request.agent.Network.ANY,
      data: await this.getFilesAndData(context.cacheDir, fileUris),
      token: UPLOAD_TOKEN,
      index: 0, // 指定片段上传的文件
      begins: begin,
      ends: end
    };

    try {
      this.uploadTask = await request.agent.create(context, config);
      this.uploadTask.on('progress', (progress: request.agent.Progress) => {
        let processed = Number(progress.processed.toString()).valueOf();
        let size = progress.sizes[progress.index];
        if (progress.index === 0) {
          if (end === -1) {
            size -= begin;
          } else {
            size = end - begin + 1;
          }
        }
         
        let process: number = Math.floor(processed / size * 100);
        if (process < 100) {
          callback(process, false);
        }
      });
      this.uploadTask.on('completed', (progress: request.agent.Progress) => {
        callback(100, true);
        this.cancelTask();
      });
      this.uploadTask.on('failed', async (progress: request.agent.Progress) => {
        if (this.uploadTask) {
          let taskInfo = await request.agent.touch(this.uploadTask.tid, UPLOAD_TOKEN);
        }
        callback(100, false);
        this.cancelTask();
      })
      await this.uploadTask.start();
    } catch (err) {
      callback(100, false);
    }
  }
}
```

* 下载文件核心代码如下

```
import common from '@ohos.app.ability.common';
import request from '@ohos.request';
import promptAction from '@ohos.promptAction';

class RequestDownload {
  async downloadFile(folder: string, url: string, callback: (progress: number, isSuccess: boolean) => void) {
    // 查询到存在正在执行的下载任务,提示并返回
    let tasks = await request.agent.search({
      state: request.agent.State.RUNNING,
      action: request.agent.Action.DOWNLOAD,
      mode: request.agent.Mode.FOREGROUND
    });
    if (tasks.length > 0) {
      promptAction.showToast({ message: $r('app.string.have_download_task_tips'), bottom: TOAST_BOTTOM });
      return;
    }
    let splitUrl = url.split('//')[1].split('/');
    let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    let downloadConfig: request.agent.Config = {
      action: request.agent.Action.DOWNLOAD,
      url: url,
      method: 'POST',
      title: 'download',
      mode: request.agent.Mode.FOREGROUND,
      network: request.agent.Network.ANY,
      saveas: `./${folder}/${splitUrl[splitUrl.length-1]}`,
      overwrite: true
    }
   
    try {
      this.downloadTask = await request.agent.create(context, downloadConfig);
      this.downloadTask.on('progress', (progress: request.agent.Progress) => {
        let processed = Number(progress.processed.toString()).valueOf();
        let size = progress.sizes[0];
        let process: number = Math.floor(processed / size * 100);
        if (process < 100) {
          callback(process, false);
        }
      })
      this.downloadTask.on('completed', (progress: request.agent.Progress) => {
        callback(100, true);
        this.deleteTask();
      })
      this.downloadTask.on('failed', async (progress: request.agent.Progress) => {
        if (this.downloadTask) {
          let taskInfo = await request.agent.show(this.downloadTask.tid);
        }
        callback(100, false);
        this.deleteTask();
      })
      await this.downloadTask.start();
    } catch (err) {
      callback(100, false);
    }
  }
}
```

### sample仓地址:

本功能的sample仓地址:[https://gitee.com/openharmony/applications\_app\_samples/tree/master/code/BasicFeature/Connectivity/UploadAndDownLoad](https://gitee.com/openharmony/ap ... y/UploadAndDownLoad)

[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5