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.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'; 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.INTERNET。 77 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