1# 应用文件上传下载
2
3应用可以将应用文件上传到网络服务器,也可以从网络服务器下载网络资源文件到本地应用文件目录。
4
5## 上传应用文件
6
7开发者可以使用上传下载模块([ohos.request](../../reference/apis-basic-services-kit/js-apis-request.md))的上传接口将本地文件上传。文件上传过程使用系统服务代理完成,在api12中request.agent.create接口增加了设置代理地址参数,支持用户设置自定义代理地址。
8
9> **说明:**
10>
11> 当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。
12>
13> 使用上传下载模块,需[声明权限](../../security/AccessToken/declare-permissions.md):ohos.permission.INTERNET14
15以下示例代码演示两种将应用缓存文件路径下的文件上传至网络服务器的方式:
16
17```ts
18// 方式一:request.uploadFile
19// pages/xxx.ets
20import { common } from '@kit.AbilityKit';
21import fs from '@ohos.file.fs';
22import { BusinessError, request } from '@kit.BasicServicesKit';
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 files: Array<request.File> = [
35//uri前缀internal://cache 对应cacheDir目录
36  { filename: 'test.txt', name: 'test', uri: 'internal://cache/test.txt', type: 'txt' }
37]
38let data: Array<request.RequestData> = [{ name: 'name', value: 'value' }];
39let uploadConfig: request.UploadConfig = {
40  url: 'https://xxx',
41  header: {
42    'key1':'value1',
43    'key2':'value2'
44  },
45  method: 'POST',
46  files: files,
47  data: data
48}
49
50// 将本地应用文件上传至网络服务器
51try {
52  request.uploadFile(context, uploadConfig)
53    .then((uploadTask: request.UploadTask) => {
54      uploadTask.on('complete', (taskStates: Array<request.TaskState>) => {
55        for (let i = 0; i < taskStates.length; i++) {
56          console.info(`upload complete taskState: ${JSON.stringify(taskStates[i])}`);
57        }
58      });
59    })
60    .catch((err: BusinessError) => {
61      console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
62    })
63} catch (error) {
64  let err: BusinessError = error as BusinessError;
65  console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
66}
67```
68
69```ts
70// 方式二:request.agent
71// pages/xxx.ets
72import { common } from '@kit.AbilityKit';
73import fs from '@ohos.file.fs';
74import { BusinessError, request } from '@kit.BasicServicesKit';
75// 获取应用文件路径
76let context = getContext(this) as common.UIAbilityContext;
77let cacheDir = context.cacheDir;
78
79// 新建一个本地应用文件
80let file = fs.openSync(cacheDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
81fs.writeSync(file.fd, 'upload file test');
82fs.closeSync(file);
83let attachments: Array<request.agent.FormItem> = [{
84  name: "test",
85  value: [
86    {
87      filename: "test.txt",
88      path: "./test.txt",
89    },
90  ]
91}];
92let config: request.agent.Config = {
93  action: request.agent.Action.UPLOAD,
94  url: 'http://xxx',
95  mode: request.agent.Mode.FOREGROUND,
96  overwrite: true,
97  method: "POST",
98  headers: {
99    'key1':'value1',
100    'key2':'value2'
101  },
102  data: attachments,
103  saveas: "./"
104};
105request.agent.create(getContext(), config).then((task: request.agent.Task) => {
106  task.start((err: BusinessError) => {
107    if (err) {
108      console.error(`Failed to start the upload task, Code: ${err.code}  message: ${err.message}`);
109      return;
110    }
111  });
112  task.on('progress', async(progress) => {
113    console.warn(`/Request upload status ${progress.state}, uploaded ${progress.processed}`);
114  })
115  task.on('completed', async() => {
116    console.warn(`/Request upload completed`);
117    //该方法需用户管理任务生命周期,任务结束后调用remove释放task对象
118    request.agent.remove(task.tid);
119  })
120}).catch((err: BusinessError) => {
121  console.error(`Failed to create a upload task, Code: ${err.code}, message: ${err.message}`);
122});
123```
124
125## 下载网络资源文件至应用文件目录
126
127开发者可以使用上传下载模块([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))对其进行访问,使用方式与[应用文件访问](../../file-management/app-file-access.md)一致。文件下载过程使用系统服务代理完成,在api12中request.agent.create接口增加了设置代理地址参数,支持用户设置自定义代理地址。
128
129> **说明:**
130>
131> 当前网络资源文件仅支持下载至应用文件目录。
132>
133> 使用上传下载模块,需[声明权限](../../security/AccessToken/declare-permissions.md):ohos.permission.INTERNET134
135以下示例代码演示两种将网络资源文件下载到应用文件目录的方式:
136
137```ts
138// 方式一:request.downloadFile
139// pages/xxx.ets
140// 将网络资源文件下载到应用文件目录并读取一段内容
141import { common } from '@kit.AbilityKit';
142import fs from '@ohos.file.fs';
143import { BusinessError, request } from '@kit.BasicServicesKit';
144import { buffer } from '@kit.ArkTS';
145
146// 获取应用文件路径
147let context = getContext(this) as common.UIAbilityContext;
148let filesDir = context.filesDir;
149
150try {
151  request.downloadFile(context, {
152    url: 'https://xxxx/xxxx.txt',
153    filePath: filesDir + '/xxxx.txt'
154  }).then((downloadTask: request.DownloadTask) => {
155    downloadTask.on('complete', () => {
156      console.info('download complete');
157      let file = fs.openSync(filesDir + '/xxxx.txt', fs.OpenMode.READ_WRITE);
158      let arrayBuffer = new ArrayBuffer(1024);
159      let readLen = fs.readSync(file.fd, arrayBuffer);
160      let buf = buffer.from(arrayBuffer, 0, readLen);
161      console.info(`The content of file: ${buf.toString()}`);
162      fs.closeSync(file);
163    })
164  }).catch((err: BusinessError) => {
165    console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
166  });
167} catch (error) {
168  let err: BusinessError = error as BusinessError;
169  console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
170}
171```
172```ts
173// 方式二:request.agent
174// pages/xxx.ets
175// 将网络资源文件下载到应用文件目录并读取一段内容
176import { BusinessError, request } from '@kit.BasicServicesKit';
177let context = getContext(this) as common.UIAbilityContext;
178let filesDir = context.filesDir;
179
180let config: request.agent.Config = {
181  action: request.agent.Action.DOWNLOAD,
182  url: 'https://xxxx/test.txt',
183  saveas: 'xxxx.txt',
184  gauge: true,
185  overwrite: true,
186  network: request.agent.Network.WIFI,
187};
188request.agent.create(context, config).then((task: request.agent.Task) => {
189  task.start((err: BusinessError) => {
190    if (err) {
191      console.error(`Failed to start the download task, Code: ${err.code}  message: ${err.message}`);
192      return;
193    }
194  });
195  task.on('progress', async(progress) => {
196    console.warn(`/Request download status ${progress.state}, downloaded ${progress.processed}`);
197  })
198  task.on('completed', async() => {
199    console.warn(`/Request download completed`);
200    let file = fs.openSync(filesDir + '/xxxx.txt', fs.OpenMode.READ_WRITE);
201    let arrayBuffer = new ArrayBuffer(1024);
202    let readLen = fs.readSync(file.fd, arrayBuffer);
203    let buf = buffer.from(arrayBuffer, 0, readLen);
204    console.info(`The content of file: ${buf.toString()}`);
205    fs.closeSync(file);
206    //该方法需用户管理任务生命周期,任务结束后调用remove释放task对象
207    request.agent.remove(task.tid);
208  })
209}).catch((err: BusinessError) => {
210  console.error(`Failed to create a download task, Code: ${err.code}, message: ${err.message}`);
211});
212```
213