鸿蒙NEXT上传图片功能PhotoViewPicker核心功能解析

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: `PhotoViewPicker` 是鸿蒙系统中用于媒体资源选择的核心组件,通过它可以便捷地实现图片、视频等媒体文件的选择功能。下面从基本用法、参数配置到高级应用进行全面解析:

鸿蒙NEXT上传图片功能PhotoViewPicker核心功能解析 #ArkTS#鸿蒙Next#HarmonyOS_SDK应用服务#HarmonyOS 语言

PhotoViewPicker 是鸿蒙系统中用于媒体资源选择的核心组件,通过它可以便捷地实现图片、视频等媒体文件的选择功能。下面从基本用法、参数配置到高级应用进行全面解析:

一、PhotoViewPicker 基础用法

PhotoViewPicker 的使用流程主要分为三步:

  1. 创建实例
  2. 配置参数
  3. 启动选择器获取结果

以下是最基本的使用示例:

import photoAccessHelper from "@ohos.photoAccess.photoAccessHelper";

async function pickImage() {
   
  try {
   
    // 1. 创建选择器实例
    const picker = photoAccessHelper.createPhotoViewPicker();

    // 2. 配置选择参数(此处使用默认配置)
    const options = {
   
      MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE, // 只选择图片
      maxSelectNumber: 1, // 最多选择张数
      isSearchSupported: true, // 显示搜索
      isPhotoTakingSupported: true, // 支持拍照
      recommendationOptions: true, // 智能推荐
      preselectedUris: true, // 预览文件
      isPreviewForSingleSelectionSupported: true, // 单选是否支持预览
    };

    // 3. 启动选择器并获取结果
    const selectedAssets = await picker.select(options);

    if (selectedAssets.photoUris.length) {
   
      // 处理选择的资源
      console.info("选择的资源:", selectedAssets.photoUris);
    }
  } catch (error) {
   
    console.error("选择图片失败:", error);
  }
}

二、关键参数详解

PhotoViewPicker 的参数配置非常灵活,可以根据需求定制选择器的行为:

const options = {
   
  MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE, // 只选择图片
  maxSelectNumber: 1, // 最多选择张数
  isSearchSupported: true, // 显示搜索
  isPhotoTakingSupported: true, // 支持拍照
  recommendationOptions: true, // 智能推荐
  preselectedUris: true, // 预览文件
  isPreviewForSingleSelectionSupported: true, // 单选是否支持预览
};

三、MIMEType 参数深度解析

MIMEType 参数是 PhotoViewPicker 中非常强大的一个配置项,它允许你精确控制选择器中显示的文件类型:

// 示例1:只允许选择JPEG和PNG图片
IMAGE_TYPE = 'image/*',
// 示例2:只允许选择视频文件
VIDEO_TYPE = 'video/*',
// 示例3:
MOVING_PHOTO_IMAGE_TYPE = 'image/movingPhoto'
// 示例4:允许所有
IMAGE_VIDEO_TYPE = '*/*',

四、处理选择结果

选择器返回的结果是一个 PhotoSelectResult 对象,包含以下关键属性:

class PhotoSelectResult {
   
  /**
   * The uris for the selected files.
   *
   * @type { Array<string> }
   * @syscap SystemCapability.FileManagement.PhotoAccessHelper.Core
   * @since 10
   */
  /**
   * The uris for the selected files.
   *
   * @type { Array<string> }
   * @syscap SystemCapability.FileManagement.PhotoAccessHelper.Core
   * @atomicservice
   * @since 11
   */
  /**
   * The uris for the selected files.
   *
   * @type { Array<string> }
   * @syscap SystemCapability.FileManagement.PhotoAccessHelper.Core
   * @crossplatform
   * @atomicservice
   * @since 12
   */
  photoUris: Array<string>;
  /**
   * Original option.
   *
   * @type { boolean }
   * @syscap SystemCapability.FileManagement.PhotoAccessHelper.Core
   * @since 10
   */
  /**
   * Original option.
   *
   * @type { boolean }
   * @syscap SystemCapability.FileManagement.PhotoAccessHelper.Core
   * @atomicservice
   * @since 11
   */
  /**
   * Original option.
   *
   * @type { boolean }
   * @syscap SystemCapability.FileManagement.PhotoAccessHelper.Core
   * @crossplatform
   * @atomicservice
   * @since 12
   */
  isOriginalPhoto: boolean;
}
  • 获取到资源后,通常需要进行以下处理:
  1. 使用文件 URI 读取文件内容
  2. 进行必要的格式转换(如压缩图片)
  3. 上传到服务器或保存到本地
// 这里以oss上传为例
// uri为选择图片路径
import {
    http } from '@kit.NetworkKit';
import fs from '@ohos.file.fs'
import {
    request } from '@kit.BasicServicesKit';
export async function upload (uri: string): Promise<string> {
   
  // 此处从服务器获取
  const data = {
   
    policy: 'qweqwe',
    signature: 'qweqwe',
    ossAccessKeyId: 'qweqwe',
    host: 'https://???/api',
  };
  const name = Date.now() + '.' + uri.split('.').pop();
  const key = `${
     new Date().getFullYear()}/${
     name}`
  const context = getContext();
  // 通过getContext获取沙箱地址
  const destPath = `${
     context.cacheDir}/${
     name}`;
  const file = fs.openSync(uri);
  // 将文件复制一份到沙箱缓存地址,这一步尤为重要,只有沙箱地址的文件可以进行上传操作
  fs.copyFileSync(file.fd, destPath);
  const result = await request.uploadFile(context,{
   
    // files字段是上传的文件组成的列表,类型为formData
    files: [{
    filename: 'file', name: 'file', uri: `internal://cache/${
     name}`, type: 'image/jpeg' }],
    // data字段是携带的参数,建议把类型设置为formData
    data: [
      {
    name: 'name', value: `${
     name}`, },
      {
    name: 'policy', value: `${
     data.policy}` },
      {
    name: 'OSSAccessKeyId', value: Object.values(data)[2] },
      {
    name: 'signature', value: `${
     data.signature}` },
      {
    name: 'key', value: key },
    ],
    method: http.RequestMethod.POST,
    header: {
   
      Accept: '*/*',
      // 设置header确保参数类型为FormData
      "Content-Type": "multipart/form-data"
    },
    // 请求地址
    url: data.host
  });
  return new Promise((res, rej) => {
   
    result.on('progress', (u, t) => {
   
      console.log('进度', u / t);
    });
    result.on('complete', e => {
   
      console.log('ok', JSON.stringify(e));
      res(`${
     data.host + key}`);
    });
    result.on('fail', e => {
   
      console.log('错误', JSON.stringify(e));
      rej(e);
    })
  });
}

五、注意事项与常见问题

  • 权限要求 需要在 config.json 中声明文件访问权限:
{
   
  "requestPermissions": [
    {
   
      "name": "ohos.permission.READ_MEDIA",
      "reason": "需要访问媒体文件"
    }
  ]
}
  • 文件处理注意

    • 系统媒体库中的文件 URI 通常是临时的,建议复制到应用私有目录再使用
const name = Date.now() + "";
const key = `${
     new Date().toLocaleDateString()}/${
     name}`;
const context = getContext();
const destPath = `${
     context.cacheDir}/${
     name}`;
const file = fileIo.openSync(uri);
fileIo.copyFileSync(file.fd, destPath);
console.log(destPath);
  • 大文件处理时建议进行异步操作,避免 UI 卡顿
  • request.uploadFile文件上传时候一直报错 401

  • 兼容性注意

      • 不同鸿蒙版本的 API 可能存在差异,建议在开发前查阅对应版本的官方文档
      • 部分参数(如 title、initialDirectory)可能只在特定版本中支持

通过合理配置 PhotoViewPicker 的各项参数,开发者可以轻松实现符合需求的媒体选择功能,为应用增色不少。

目录
相关文章
|
2月前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
404 39
|
3月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
167 1
|
3月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
382 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
3月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
168 1
|
3月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
307 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
3月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段三
本文介绍了UI开发中的样式复用与组件构建技术,涵盖@Extend、@Styles和@Builder的使用方法,并通过Swiper轮播、Scroll滚动、Tabs导航等常用组件实现典型界面效果,结合生肖抽卡、小米轮播、回顶按钮等案例,展示实际应用技巧。
125 1
|
3月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
本文介绍鸿蒙应用界面开发中的弹性布局(Flex)、绝对定位、层叠布局及ArkTS语法进阶,涵盖字符串拼接、类型转换、数组操作、条件与循环语句,并结合B站视频卡、支付宝首页等案例,深入讲解点击事件、状态管理与界面交互功能。
262 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
|
3月前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
506 0
|
4月前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
217 1
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
263 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡