• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 应用文件上传下载
2
3应用可以将应用文件上传到网络服务器,也可以从网络服务器下载网络资源文件到本地应用文件目录。
4
5## 上传应用文件
6
7开发者可以使用上传下载模块([ohos.request](../reference/apis-basic-services-kit/js-apis-request.md))的上传接口将本地文件上传。文件上传过程使用系统服务代理完成。
8
9> **说明:**
10>
11> 当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。
12>
13> 使用上传下载模块,需[声明权限](../security/AccessToken/declare-permissions.md):ohos.permission.INTERNET14
15以下示例代码演示了如何将应用缓存文件路径下的文件上传至网络服务器。
16
17```ts
18// pages/xxx.ets
19import common from '@ohos.app.ability.common';
20import fs from '@ohos.file.fs';
21import request from '@ohos.request';
22import { BusinessError } from '@ohos.base';
23
24// 获取应用文件路径
25let context = getContext(this) as common.UIAbilityContext;
26let cacheDir = context.cacheDir;
27
28// 新建一个本地应用文件
29let file = fs.openSync(cacheDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
30fs.writeSync(file.fd, 'upload file test');
31fs.closeSync(file);
32
33// 上传任务配置项
34let header = new Map<Object, string>();
35header.set('key1', 'value1');
36header.set('key2', 'value2');
37let files: Array<request.File> = [
38  { filename: 'test.txt', name: 'test', uri: 'internal://cache/test.txt', type: 'txt' }
39]
40let data: Array<request.RequestData> = [{ name: 'name', value: 'value' }];
41let uploadConfig: request.UploadConfig = {
42  url: 'https://xxx',
43  header: header,
44  method: 'POST',
45  files: files,
46  data: data
47}
48
49// 将本地应用文件上传至网络服务器
50try {
51  request.uploadFile(context, uploadConfig)
52    .then((uploadTask: request.UploadTask) => {
53      uploadTask.on('complete', (taskStates: Array<request.TaskState>) => {
54        for (let i = 0; i < taskStates.length; i++) {
55          console.info(`upload complete taskState: ${JSON.stringify(taskStates[i])}`);
56        }
57      });
58    })
59    .catch((err: BusinessError) => {
60      console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
61    })
62} catch (error) {
63  let err: BusinessError = error as BusinessError;
64  console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
65}
66```
67
68## 下载网络资源文件至应用文件目录
69
70开发者可以使用上传下载模块([ohos.request](../reference/apis-basic-services-kit/js-apis-request.md))的下载接口将网络资源文件下载到应用文件目录。对已下载的网络资源文件,开发者可以使用基础文件IO接口([ohos.file.fs](../reference/apis-core-file-kit/js-apis-file-fs.md))对其进行访问,使用方式与[应用文件访问](app-file-access.md)一致。文件下载过程使用系统服务代理完成。
71
72> **说明:**
73>
74> 当前网络资源文件仅支持下载至应用文件目录。
75>
76> 使用上传下载模块,需[声明权限](../security/AccessToken/declare-permissions.md):ohos.permission.INTERNET77
78以下示例代码演示了如何将网络资源文件下载到应用文件目录:
79
80```ts
81// pages/xxx.ets
82// 将网络资源文件下载到应用文件目录并读取一段内容
83import common from '@ohos.app.ability.common';
84import fs from '@ohos.file.fs';
85import request from '@ohos.request';
86import { BusinessError } from '@ohos.base';
87import buffer from '@ohos.buffer';
88
89// 获取应用文件路径
90let context = getContext(this) as common.UIAbilityContext;
91let filesDir = context.filesDir;
92
93try {
94  request.downloadFile(context, {
95    url: 'https://xxxx/xxxx.txt',
96    filePath: filesDir + '/xxxx.txt'
97  }).then((downloadTask: request.DownloadTask) => {
98    downloadTask.on('complete', () => {
99      console.info('download complete');
100      let file = fs.openSync(filesDir + '/xxxx.txt', fs.OpenMode.READ_WRITE);
101      let arrayBuffer = new ArrayBuffer(1024);
102      let readLen = fs.readSync(file.fd, arrayBuffer);
103      let buf = buffer.from(arrayBuffer, 0, readLen);
104      console.info(`The content of file: ${buf.toString()}`);
105      fs.closeSync(file);
106    })
107  }).catch((err: BusinessError) => {
108    console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
109  });
110} catch (error) {
111  let err: BusinessError = error as BusinessError;
112  console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
113}
114```
115