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.INTERNET。 14 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.INTERNET。 134 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