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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*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 的各项参数,开发者可以轻松实现符合需求的媒体选择功能,为应用增色不少。

目录
相关文章
|
23天前
|
测试技术 开发工具 开发者
HarmonyOS Next快速入门:了解项目工程目录结构
本教程旨在帮助开发者快速上手HarmonyOS应用开发,涵盖从环境搭建到工程创建的全流程。通过DevEco Studio创建首个项目时,选择“Application”与“Empty Ability”,配置项目名称、包名、保存路径等关键信息后完成创建。代码示例展示了基本UI组件的使用,如`Hello World`文本显示与交互逻辑。此外,详细解析了工程目录结构,包括AppScope自动生成规则、主模块(entry)的功能划分、依赖配置文件(oh-package.json5)的作用,以及app.json5中包名、版本号等全局配置项的含义。
56 5
|
17天前
|
开发者 UED
HarmonyOS Next快速入门:通用属性
本教程以《HarmonyOS Next快速入门》为基础,涵盖应用开发核心技能。通过代码实例讲解尺寸、位置、布局约束、Flex布局、边框、背景及图像效果等属性设置方法。如`.width()`调整宽度,`.align()`设定对齐方式,`.border()`配置边框样式,以及模糊、阴影等视觉效果的实现。结合实际案例,帮助开发者掌握HarmonyOS组件属性的灵活运用,提升开发效率与用户体验。适合初学者及进阶开发者学习。
58 0
|
17天前
|
开发者
HarmonyOS Next快速入门:通用事件
本教程聚焦HarmonyOS应用开发,涵盖事件处理的核心内容。包括事件分发、触屏事件、键鼠事件、焦点事件及拖拽事件等。通过代码实例讲解点击事件、触控事件(Down/Move/Up)、获焦与失焦事件的处理逻辑,以及气泡弹窗的应用。适合开发者快速掌握HarmonyOS Next中通用事件的使用方法,提升应用交互体验。
59 0
|
17天前
|
开发者 容器
HarmonyOS Next快速入门:Button组件
本教程摘自《HarmonyOS Next快速入门》,聚焦HarmonyOS应用开发中的Button组件。Button支持胶囊、圆形和普通三种类型,可通过子组件实现复杂功能,如嵌入图片或文字。支持自定义样式(边框弧度、文本样式、背景色等)及点击事件处理。示例代码展示了不同类型按钮的创建与交互逻辑,助开发者快速上手。适合HarmonyOS初学者及对UI组件感兴趣的开发者学习。
60 0
|
17天前
|
开发者
HarmonyOS Next快速入门:Image组件
本教程摘自《HarmonyOS Next快速入门》,专注于HarmonyOS应用开发中的Image组件使用。Image组件支持多种图片格式(如png、jpg、svg等),可渲染本地资源、网络图片、媒体库文件及PixelMap像素图。通过设置`objectFit`属性,实现不同缩放类型;利用`fillColor`属性调整矢量图颜色。示例代码涵盖本地、网络及资源图片的加载与样式设置,同时需在`module.json5`中声明网络权限以加载外部资源。适合开发者快速掌握HarmonyOS图像展示功能。
65 0
|
27天前
|
监控 JavaScript 前端开发
🎉 Harmony OS Next里的Web组件:网页加载的全流程掌控手册
本文详细解析了Harmony OS Next中ArkUI Web组件的九大生命周期回调,帮助开发者全面掌控网页加载流程。从组件初始化到加载完成,再到异常处理与性能优化,每个阶段都配有具体代码示例和注意事项。内容涵盖关键回调(如aboutToAppear、onPageBegin)的使用场景、网页加载进度监控(FCP/FMP/LCP)、以及前端页面优化实践。通过本文,开发者可以高效管理网页加载过程,提升应用性能与用户体验。
57 0
|
27天前
|
API UED 开发者
Harmony OS Next玩转多层级手势事件:当组件遇上“套娃”,触摸该怎么分家?
在HarmonyOS开发中,处理多层级手势事件是一项挑战,尤其在“组件套组件”的复杂布局下。本文深入探讨了触摸事件的基础原理、父子组件间的手势竞争规则以及如何通过`responseRegion`和`hitTestBehavior`等属性自定义触摸分发逻辑。同时介绍了`.gesture()`、`.priorityGesture()`和`.parallelGesture()`三种手势绑定方法,帮助开发者灵活调整手势优先级。掌握这些技巧,可精准控制复杂交互中的触摸行为,提升用户体验。
35 0