楼主您好,可以参考如下案例,跟1楼回复的类似,主要分两步,一步是使用PhotoViewPicker实现图库文件选择,一步是将选择后的文件使用网络请求传到服务器(可以用二进制或者文件路径格式),网络请求可以使用RCP/Network Ki都可以
下面是之前实现的一段用RCP实现图片上传的示例代码demo,供参考:
function testRcpMultiPartUpload(uris: Array<string>): void {
let file = fs.openSync(uris[0], fs.OpenMode.READ_ONLY)
let stat = fs.statSync(file.fd)
let buf = new ArrayBuffer(stat.size)
let readLen = fs.readSync(file.fd, buf)
console.info('readSync data to file succeed and buffer size is:' + readLen);
let headers: rcp.RequestHeaders = { "content-type": 'multipart/form-data' };
let session = rcp.createSession();
let multiFormFieldValue = buildMultipartFormFieldValue(file.name, buf, 'image/jpeg');
let multiForm = new rcp.MultipartForm({ file: [multiFormFieldValue] });
let req = new rcp.Request('xxx url', "POST", headers, multiForm);
session.fetch(req).then((response) => {
promptAction.showToast({message: '上传成功'})
}).catch(() => {
console.log("请求失败:" + JSON.stringify(req))
}).finally(() => {
session.close();
});
}
function buildMultipartFormFieldValue(file: string, pathOrContent: string | ArrayBuffer, contentType: string): rcp.MultipartFormFieldValue {
let result: rcp.MultipartFormFieldValue = {
remoteFileName: file,
contentType: contentType,
contentOrPath: { content: pathOrContent }
}
return result;
}
@Entry
@Component
struct Index {
@State uris: Array<string> = []; // 全局变量保存图库选择的结果uri
async getFileAssets() {
const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
this.uris = photoSelectResult.photoUris;
}).catch((err: BusinessError) => {
})
}
build() {
Row() {
Column() {
Text("点击选择图片").fontSize(50).fontWeight(FontWeight.Bold)
.height("20%")
.onClick(() => {
this.getFileAssets()
})
Text("点击上传文件").fontSize(50).fontWeight(FontWeight.Bold)
.height("20%")
.onClick(() => {
testRcpMultiPartUpload(this.uris)
})
}.width('100%')
}.height('100%')
}
}
更多关于HarmonyOS 鸿蒙Next如何实现多选图片上传的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
整体上来说. 分成两步:
-
一次选择多个图片.
-
将多个图片调用服务端接口上传(拼接成什么格式, 需要根据服务端的接口来确定)
Q1: 选择多个图片
async getMulPictureFromAlbum() {
// 拉起相册,选择图片
let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
// ps: 关键点 ***** 最多选取的照片数.
PhotoSelectOptions.maxSelectNumber = 9;
let photoPicker = new photoAccessHelper.PhotoViewPicker();
let photoSelectResult: photoAccessHelper.PhotoSelectResult = await photoPicker.select(PhotoSelectOptions);
// 打印选择的图片 uri; Logger 可以换成自己习惯的日志输出方式.
Logger.info(TAG,
`PictureFromAlbum: length: ${photoSelectResult.photoUris.length} url array: ${JSON.stringify(photoSelectResult.photoUris)}`);
}
Q2: 将多张图片上传
具体可以参考(这个实际要根据项目动态修改):
姓名
张三
性别
男
年龄
28
技能
- Python
- Java
- C++
你已经有图片上传的接口了么?
其实不同服务端接口上传方式可能有差异, 所以并没有提供对应的可执行代码.
Q1, 提供的方法, 你放一个按钮调用. 替换一下打印日志的方法. 会直接调起选择图片多个图片.
并打印出每个图片的uri.
其实只要将Q1 返回的uri 组装为上传接口需要的形式端侧的任务就完成了.
Q2: 实现上传下载官方有demo.
可以参考一下这个: https://gitee.com/harmonyos_samples/upload-and-down-load
在HarmonyOS鸿蒙系统中,实现多选图片上传的功能主要依赖于其提供的文件选择和媒体访问API。以下是一个简要的实现思路:
-
权限申请:首先,确保你的应用已经申请了必要的权限,如读取存储权限(ohos.permission.READ_MEDIA)和写入存储权限(ohos.permission.WRITE_MEDIA),以便能够访问和选择图片文件。
-
使用文件选择器:利用HarmonyOS提供的文件选择器组件(如FilePicker),允许用户从设备中选择多个图片文件。这通常通过配置选择器的multiSelect属性为true来实现。
-
获取图片路径:用户选择完图片后,通过选择器返回的回调获取所选图片的文件路径列表。
-
上传图片:利用网络请求库(如HttpURLConnection或第三方库)将获取到的图片文件上传到服务器。这通常涉及将图片文件转换为字节流,并通过HTTP POST请求发送给服务器。
-
错误处理:在处理文件选择和上传过程中,要注意捕获并处理可能出现的异常,如权限被拒绝、文件不存在或网络错误等。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html