当前位置: 首页 > article >正文

Harmony NEXT-越过相机读写权限上传图片至项目云存储中

问题成因

在制作用户注册登录界面时想要实现用户头像上传共能,查询API文档,发现有picker和PhotoAccessHelper两个包可以选择使用,但是在使用PhotoAccessHelper包拉起相册并读入所选的照片后将该照片传入云存储中产生报错,需要相册读写权限,但是该权限是受限权限,不容易获取,查询API发现有使用picker包跳过该权限实现该功能的方法,但是代码粘进项目跑了一下,发现官方给的示例代码其实还是需要申请相册读写权限的,问题回到如何跳出相册读写权限

思路产生

通过PhotoAccessHelper获取到的相册图片只是不能通过任何形式进行网络传输,但是可以在本地进行操作,那么为什么不能讲数据拷贝成一个可以任我们操作的图片对象呢?

拷贝

let storageBucket: cloudStorage.StorageBucket = cloudStorage.bucket();
          // 使用photoAccessHelper选择指定的文件
          let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
          photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
          photoSelectOptions.maxSelectNumber = 1; // 选择媒体文件的最大数目
          let photoViewPicker = new photoAccessHelper.PhotoViewPicker();
          photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
            let fileUri = photoSelectResult.photoUris[0];
            console.info(`pick file ${fileUri}`);
            let fileName = fileUri.split('/').pop() as string;
            console.info(`file name ${fileName}`);
            let cacheFile = `${Date.now()}_${fileName}`;
            console.info(`cacheFile ${cacheFile}`);
            let cacheFilePath = getContext().cacheDir + '/' + cacheFile;

            // 将选中文件copy至cache目录下,文件名为cacheFile
            try {
              let srcFile = fs.openSync(fileUri);
              let dstFile = fs.openSync(cacheFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
              fs.copyFileSync(srcFile.fd, dstFile.fd);
              fs.closeSync(srcFile);
              fs.closeSync(dstFile);
            } catch (e) {
              console.info(`copy file failed ${e.message}`);
              return;
            }

这里上传到云存储需要的是cache层级的文件存储路径,如果有其他需求也可以改成其他路径

上传至云存储

      // 上传至云存储默认实例
            storageBucket.uploadFile(getContext(this), {
              localPath: cacheFile, // 本地文件路径,context.cacheDir目录下的文件
              cloudPath: `云测路径/${fileName}`    // 云侧路径
            }).then(async (task: request.agent.Task) => {
              task.on('progress', (progress) => {
                console.info(`on progress ${JSON.stringify(progress)}`);
              });
              task.on('completed', (progress) => {
                console.info(`on completed ${JSON.stringify(progress)}`);
              });
              task.on('failed', (progress) => {
                console.error(`on failed ${JSON.stringify(progress)}`);
              });
              task.on('response', (response) => {
                console.info(`on response ${JSON.stringify(response)}`);
              });

              // start task
              task.start((err: BusinessError) => {
                if (err) {
                  console.error(`Failed to start the uploadFile task, Code: ${err.code}, message: ${err.message}`);
                } else {
                  console.info(`Succeeded in starting a uploadFile task.`);
                }
              });
              const url = await storageBucket.getDownloadURL(`avatar/${fileName}`)
              console.log('测试获取下载地址' + url)
              this.avatar = url
            }).catch((err: BusinessError) => {
              console.error(`uploadFile failed, Code: ${err.code}, message: ${err.message}`);
            });

在API12版本可用的跳过相册读写权限从相册读取照片并上传至网络就完成了!


http://www.kler.cn/a/419045.html

相关文章:

  • iQOO Neo10系列携三大蓝科技亮相,性能与续航全面升级
  • 详解QtPDF之 QPdfLink
  • 云备份实战项目
  • 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机
  • SnowFlake
  • 【接口封装】——11、Qt 的单例模式
  • Solidity基础语法
  • 纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
  • js对于json的序列化、反序列化有哪几种方法
  • 计算机网络基础篇
  • idea 自动导包,并且禁止自动导 *(java.io.*)
  • 数据结构之堆:原理与实现
  • 《Python基础》之类的定义、封装、继承
  • ubuntu 安装docker-compose
  • PHP操作redis删除指定前缀的key值
  • Apache storm安装教程(单机版)
  • 简单图论农场派对
  • 基于CentOS系统利用Kamailio搭建企业级SIP服务器
  • 青少年编程等级一级 自动打包机问题
  • learning_curve | 学习、理解以及使用学习曲线在评估型性能和诊断模型问题中的使用
  • 基于Matlab实现车牌识别系统(源码+图像)
  • WPF+MVVM案例实战与特效(二十九)- Combox绑定集合、枚举与固定值
  • matlab代码--卷积神经网络的手写数字识别
  • IOC控制反转DI依赖注入(Java EE 学习笔记06)
  • 【RISC-V CPU Debug 专栏 1 -- RISC-V debug 规范】
  • 20241128解决Ubuntu20.04安装libesd0-dev异常的问题