可以参考以下demo:import { rcp } from '@kit.RemoteCommunicationKit'; import { picker } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; import fs from '@ohos.file.fs'; function testRcpMultiPartUpload(uris: Array<string>): void { //根据uri获取文件对象 let file = fs.openSync(uris[0], fs.OpenMode.READ_ONLY) console.log("文件对象:" + file) console.log("文件路径:" + uris[0]) //获取文件状态 let stat = fs.statSync(file.fd) //根据文件长度创建一个ArrayBuffer对象 let buf = new ArrayBuffer(stat.size) //打印文件长度 console.log("文件长度:" + stat.size); //读取文件 //fs.readSync是Node.js中fs模块提供的同步读取文件的方法。 //它返回一个整数值,表示实际读取到的字节数。 // 如果读取失败,它会抛出一个错误 // 如果读取成功,它会将读取到的数据存储到指定的Buffer对象中。 fs.readSync(file.fd, buf) console.log("文件转换二进制数组:" + buf) // 设置请求头 let headers: rcp.RequestHeaders = { "content-type": 'multipart/form-data' }; // 创建一个session会话 let session = rcp.createSession(); let multiFormFieldValue = buildMultipartFormFieldValue(file.name, buf, 'image/jpeg'); //new一个multiForm对象 let multiForm = new rcp.MultipartForm({ multiFormFieldValue }); //发送请求 let req = new rcp.Request('http://127.0.0.1:9588/upload/image', "POST", headers, multiForm); session.fetch(req).then((response) => { console.log("请求返回:" + response) }).catch(() => { console.log("请求失败:" + JSON.stringify(req)) }).finally(() => { session.close(); }); } function buildMultipartFormFieldValue(fileName: string, pathOrContent: string | ArrayBuffer, contentType: string): rcp.MultipartFormFieldValue { let result: rcp.MultipartFormFieldValue = { remoteFileName: fileName, contentType: contentType, //传文件二进制内容或者是文件的路径 contentOrPath: { content: pathOrContent } } return result; } @Entry @Component struct Index { @State uris: Array<string> = []; // 全局变量保存图库选择的结果uri // 接口采用promise异步返回形式,传入可选参数DocumentSelectOptions对象,返回选择文件的uri数组。 async getFileAssetsFromType() { const photoSelectOptions = new picker.PhotoSelectOptions(); // 创建图片-音频类型文件-预览的图库选项实例 // 选择媒体文件类型和选择媒体文件的最大数目 photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 选择媒体文件类型为Image photoSelectOptions.maxSelectNumber = 2; // 选择媒体文件的最大数目 // 创建图库选择器实例,调用photoViewPicker.select()接口拉起图库界面进行文件选择,文件选择成功后,返回photoSelectResult结果集。 const photoViewPicker = new picker.PhotoViewPicker(); photoViewPicker.select(photoSelectOptions) .then((photoSelectResult) => { // select返回的uri权限是只读权限,需要将uri写入全局变量@State中即可进行读取文件数据操作。 this.uris = photoSelectResult.photoUris; }).catch((err: BusinessError) => { return; }) } build() { Row() { Column() { Text("点击选择图片").fontSize(50).fontWeight(FontWeight.Bold) .height("20%") .onClick(() => { this.getFileAssetsFromType() }) Text("点击上传文件").fontSize(50).fontWeight(FontWeight.Bold) .height("20%") .onClick(() => { testRcpMultiPartUpload(this.uris) }) }.width('100%') }.height('100%') } }
可以参考以下demo: