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