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

HarmonyOS NEXT——【鸿蒙相册图片以及文件上传Picker封装】

1、鸿蒙系统文件/图片上传base64:

鸿蒙应用需要上传图片或者文件时,由于更高的安全性与更严谨的访问权限,通常无法直接从系统相册或文件管理中直接上传,因此我们可以通过picker对象去拉起相册访问的能力,引导用户选择需要上传的一张图片或者一份文件,将其写入沙箱,从而通过沙箱路径间接达到了上传的效果。

效果(上传图片):

效果(上传文件):

参考代码封装:

import { fileIo as fs, picker } from '@kit.CoreFileKit';
import util from '@ohos.util';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
​
export class GetSystemFileUtils {
  static async getBase64Files(fileType: string) {
    return new Promise<GetFileType>(async (resolve, reject) => {
​
      let filePath = ''
      if(fileType == '.png' || fileType == '.jpg'){
        //选择图片类型进行上传
        const photoSelectOption = new photoAccessHelper.PhotoSelectOptions();
        photoSelectOption.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
        photoSelectOption.maxSelectNumber = 1; // 选择媒体文件的最大数目
        // 打开相册选择图片
        const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
        const photoSelectResult = await photoViewPicker.select(photoSelectOption)
        // 文件操作
        // 获取照片的uri地址
         filePath = photoSelectResult.photoUris[0]
      }
      else {
        //选择文件类型进行上传(例如:.txt、.pdf等)
        let filePicker = new picker.DocumentViewPicker();
        let result = await filePicker.select();
         filePath = result[0]
      }
​
      //选择的文件格式不符合
      let selectFilType = filePath.split('.').pop()
      if ('.' + selectFilType !== fileType) {
        reject()
      }
       //获取沙箱路径
      const file = fs.openSync(filePath)
      const stat = fs.statSync(file.fd)
      const buffer = new ArrayBuffer(stat.size)
      fs.readSync(file.fd, buffer)
      fs.closeSync(file)
​
      // 转成base64编码的字符串
      const helper = new util.Base64Helper()
      const base64Res = helper.encodeToStringSync(new Uint8Array(buffer))
      // }
      let startIndex = filePath.lastIndexOf('/') + 1;
​
      // 找到文件名中最后一个'.'的索引位置
      let endIndex = filePath.lastIndexOf('.');
​
      // 截取字符串
      let utfUriFileName = filePath.slice(startIndex, endIndex);
      //解码
      let fileTitle = decodeURIComponent(utfUriFileName);
      let FileContent: GetFileType = {
        base64File: base64Res,
        fileTitle: fileTitle
      }
      resolve(FileContent)
​
    })
  }
}
​
interface GetFileType {
  base64File: string
  fileTitle: string
}

调用类

GetSystemFileUtils.getBase64Files(fileType).then((base64Files) => {
//获取到结果,文件名以及base64格式的文件。根据需求自行上传处理
  context.sendBridgeResult({ fileBase64: base64Files.base64File, fileName: base64Files.fileTitle })
})
  .catch(() => {
    WindowUtils.showToast({ message: "只支持" + fileType + "格式文件" })
  })

相关文章:

  • Stereolabs ZED Box Mini:NVIDIA Orin™驱动,双GMSL2输入,智能机器视觉AI新选择”
  • android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
  • 【从零实现Json-Rpc框架】- 项目实现 -抽象消息类实现篇
  • Uni-app入门到精通:subPackages节点为小程序的分包加载配置
  • 实现金蝶与钉钉无缝对接以高效管理银行账号信息
  • 人脸识别新规落地,“多模态认证”将成常态
  • 每日一题之日期统计
  • 为什么大模型在 OCR 任务上表现不佳?
  • 包络解调在故障诊断中的应用-广义检波解调案例
  • 架构师面试(二十二):TCP 协议
  • PDF处理控件Spire.PDF系列教程:使用 JavaScript 在 React 中将 PDF 转换为 HTML
  • java八股文之企业场景
  • rv1106抓h264流
  • 从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档
  • 【leetcode刷题记录】(java)贪心
  • Netty - 从Nginx 四层(TCP/UDP)流量中获取客户端真实/网络出口IP
  • Java实现pdf中动态插入图片
  • 如何在 Postman 中正确设置 Session 以维持用户状态?
  • 亚马逊云科技提供完全托管的DeepSeek-R1模型
  • SEO(搜索引擎优化)详解
  • 国税总局上海市税务局回应刘晓庆被举报涉嫌偷漏税:正依法依规办理
  • AI含量非常高,2025上海教育博览会将于本周五开幕
  • 真人秀《幸存者》百万美元奖金,25年间“缩水”近一半
  • 人民日报访巴西总统卢拉:“巴中关系正处于历史最好时期”
  • 从采购到销售!市场监管总局指导行业协会防控肉品风险
  • 重庆一高校75万采购市价299元产品?工作人员:正在处理