HarmonyOS 鸿蒙Next如何实现多选图片上传

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next如何实现多选图片上传 鸿蒙如何实现多选图片上传

7 回复

楼主您好,可以参考如下案例,跟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


环境准备:确保你的开发环境已经配置好鸿蒙操作系统的SDK和IDE(如DevEco Studio)。

创建项目:使用IDE创建一个新的应用项目。

权限申请:在应用的Manifest文件中申请必要的权限,例如存储权限(READ_EXTERNAL_STORAGE)和网络权限(INTERNET)。

UI设计:设计一个用户界面,用户可以通过这个界面选择图片和上传。这通常涉及到使用UI框架来创建按钮、列表、对话框等组件。

图片选择:使用文件选择器(FilePicker)或图片选择器(ImagePicker)API来让用户选择图片。

图片上传:将图片上传到服务器或云存储服务。这通常涉及到使用网络请求(如HTTP请求)API,并可能需要使用JSON或其他格式来处理服务器响应。

错误处理:处理上传过程中可能出现的错误,例如网络错误、权限拒绝等。

用户反馈:上传完成后,向用户提供反馈。

整体上来说. 分成两步:

  1. 一次选择多个图片.

  2. 将多个图片调用服务端接口上传(拼接成什么格式, 需要根据服务端的接口来确定)

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: 将多张图片上传

具体可以参考(这个实际要根据项目动态修改):

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-system-request-V5#requestuploaddeprecated

姓名

张三

性别

年龄

28

技能

  • Python
  • Java
  • C++

图片

项目名称

项目描述

  • 状态:进行中
  • 技术栈:Python, JavaScript
  • 链接项目链接

你已经有图片上传的接口了么?

其实不同服务端接口上传方式可能有差异, 所以并没有提供对应的可执行代码.

Q1, 提供的方法, 你放一个按钮调用. 替换一下打印日志的方法. 会直接调起选择图片多个图片.

并打印出每个图片的uri.

其实只要将Q1 返回的uri 组装为上传接口需要的形式端侧的任务就完成了.

Q2: 实现上传下载官方有demo.

可以参考一下这个: https://gitee.com/harmonyos_samples/upload-and-down-load

在HarmonyOS鸿蒙系统中,实现多选图片上传的功能主要依赖于其提供的文件选择和媒体访问API。以下是一个简要的实现思路:

  1. 权限申请:首先,确保你的应用已经申请了必要的权限,如读取存储权限(ohos.permission.READ_MEDIA)和写入存储权限(ohos.permission.WRITE_MEDIA),以便能够访问和选择图片文件。

  2. 使用文件选择器:利用HarmonyOS提供的文件选择器组件(如FilePicker),允许用户从设备中选择多个图片文件。这通常通过配置选择器的multiSelect属性为true来实现。

  3. 获取图片路径:用户选择完图片后,通过选择器返回的回调获取所选图片的文件路径列表。

  4. 上传图片:利用网络请求库(如HttpURLConnection或第三方库)将获取到的图片文件上传到服务器。这通常涉及将图片文件转换为字节流,并通过HTTP POST请求发送给服务器。

  5. 错误处理:在处理文件选择和上传过程中,要注意捕获并处理可能出现的异常,如权限被拒绝、文件不存在或网络错误等。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部