HarmonyOS 鸿蒙Next用户上传图片到服务器的实现

发布于 1周前 作者 eggper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next用户上传图片到服务器的实现
image.png

解决方案 首先这里需要用到鸿蒙的图片存取帮助类,他自带了安全机制,只授权给用户选取的图片。

import { photoAccessHelper } from '@kit.MediaLibraryKit'

  pickPhoto() {
    const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
    photoSelectOptions.maxSelectNumber = 1; // 选择媒体文件的最大数目

    let uris: Array<string> = [];
    const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
    photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
      uris = photoSelectResult.photoUris;
      this.img = uris[0];
      this.status = "picked"

      this.finish = false
      this.uploadedSize = 0
      this.totalSize = 0

      console.info('photoViewPicker.select to file succeed and uris are:' + uris);
    }).catch((err: BusinessError) => {
      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
    })
  }

这里我们只选取一张照片,所以把最大选取数目设成1

好了,比较关键的地方来了,因为这个选取器得到的是一个内部的URI,你不能直接用这个URI保存文件或传到服务器,我这里提供一个方法,可以将这个URL转化成

PixelMap类型,这样你就可以写入文件

  _Copy = (fileuri: string) => {
    let context = getContext(this)
    console.log('applog:fileuri:' + fileuri);
    fileIo.open(fileuri, fileIo.OpenMode.READ_ONLY).then(async (file) => {
      console.info("applog:file fd: " + file.fd);

      let pixelMap = await ImageUtil.getPixelMap(file.fd)
      if (pixelMap != undefined) {
        pixelMap = await ImageUtil.square(pixelMap)

        let newpath = context.cacheDir + "/ceshi.jpg";
        await ImageUtil.saveImageFile(newpath, pixelMap)
        this._Upfile(newpath);
      }
    }).catch((err: Error) => {
      console.info("applog:open file failed with error message: " + err.message + ", error code: ");
    });
  }

但是你这个时候拿到的文件,你就可以通过另外一个方法,把他传到你的服务器上面去

  _Upfile = (fileuri: string) => {
    console.log('applog:fileuri' + fileuri)
    this.status = "start upfile"
    let realuri = "internal://cache/" + fileuri.split("cache/")[1];
    console.log('applog:realuri' + realuri);
    let uploadConfig: request.UploadConfig = {
      url: `${API_UPLOAD_HEAD_IMAGE}?userRecordId=${getUserRecordId()}`,
      header: {},
      method: "POST",
      files: [{ filename: "ceshi.jpg", name: "headImage", uri: realuri, type: "jpg" }],
      data: [{ name: "userRecordId", value: getUserRecordId() }],
    };

    try {
      request.uploadFile(getContext(this), uploadConfig).then((data: request.UploadTask) => {
        let uploadTask = data;
        this.status = "upfile2"
        console.log('applog2');
        let upProgressCallback = (uploadedSize: number, totalSize: number) => {
          if (uploadedSize >= totalSize) {
            this.finish = true
            uploadTask.off('progress', (uploadedSize: number, totalSize: number) => {
              uploadTask.remove()
            });
          }
          this.uploadedSize = uploadedSize
          this.totalSize = totalSize
          this.status = `${uploadedSize}/${totalSize}`
          console.info("applog:upload totalSize:" + totalSize + "  uploadedSize:" + uploadedSize);
        };

        uploadTask.on('progress', upProgressCallback);
      }).catch((err: Error) => {
        console.error('Failed to request the upload. Cause: ' + JSON.stringify(err));
      });
    } catch (err) {
      console.error('applog:'+JSON.stringify(err));
      console.error('err.code : ' + err.code + ', err.message : ' + err.message);
    }
  }

好了,用这个方法,你可以使用鸿蒙自带的图片安全控件选取用户手机相册的图片传到服务器上去了!


更多关于HarmonyOS 鸿蒙Next用户上传图片到服务器的实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next用户上传图片到服务器的实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


《便了么》APP开发技术分享五 —— HarmonyOS 鸿蒙Next用户上传图片到服务器的实现

在HarmonyOS鸿蒙Next环境下,实现《便了么》APP用户上传图片到服务器的功能,主要通过以下步骤完成:

  1. 图片选择:利用鸿蒙系统提供的图片选择器API,让用户从相册或相机中选择图片。

  2. 图片处理:将选中的图片进行压缩和格式转换,以适应服务器接收的要求。鸿蒙提供了丰富的多媒体处理API,可高效完成此步骤。

  3. 网络请求:使用鸿蒙的网络请求模块,构建HTTP或HTTPS请求,将处理后的图片数据以文件流或Base64编码的形式发送到服务器。注意设置正确的请求头,包括Content-Type等。

  4. 服务器响应处理:接收并解析服务器的响应数据,根据响应结果给用户相应的提示,如上传成功、失败或需重试等。

  5. 异常处理:在网络请求、图片处理等过程中,添加异常捕获机制,确保应用稳定性。

整个过程中,需确保用户隐私安全,对图片数据进行加密处理,并在上传前获取用户明确授权。

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

回到顶部