鸿蒙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);
  }
}
AI 代码解读

二、关键参数详解

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

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

三、MIMEType 参数深度解析

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

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

四、处理选择结果

选择器返回的结果是一个 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;
}
AI 代码解读
  • 获取到资源后,通常需要进行以下处理:
  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);
    })
  });
}
AI 代码解读

五、注意事项与常见问题

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

    • 系统媒体库中的文件 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);
AI 代码解读
  • 大文件处理时建议进行异步操作,避免 UI 卡顿
  • request.uploadFile文件上传时候一直报错 401

  • 兼容性注意

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

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

目录
打赏
0
1
1
0
4
分享
相关文章
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
48 0
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
本文介绍在三层架构中实现模块依赖的步骤。首先在产品定制层(features)的oh-package.json5文件中导入共享包依赖,如"basic":"file:../../commons/basic"。然后在产品层(products)的配置文件中同时导入公共能力层和产品定制层的依赖,示例展示了如何添加"basic"和"my"两个依赖项。通过这些配置,三层架构的各模块之间建立了完整的依赖关系。
87 0
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
51 1
鸿蒙Next仓颉语言开发实战教程:设置页面
本教程介绍了仓颉语言商城应用设置页面的开发,重点讲解了List容器的使用。页面分为三组列表内容,第一组直接使用ListItem实现,后两组通过ListItemGroup及自定义组件setrow完成布局。教程还演示了如何通过自定义组件提升代码复用性,并介绍了分割线divider的设置方法,帮助开发者高效构建美观的设置界面。
|
23天前
鸿蒙Next仓颉语言开发实战教程:订单列表
本文介绍了使用仓颉语言开发HarmonyOS商城应用的订单列表页实现方法,包含导航栏、订单类型切换和订单列表展示三部分。通过代码示例讲解了布局技巧与组件使用,适合初学者学习参考。
|
23天前
鸿蒙Next仓颉语言开发实战教程:下拉刷新和上拉加载更多
本文介绍了在仓颉开发语言中实现下拉刷新和上拉加载更多的方法。通过Refresh组件实现下拉刷新,结合Timer模拟网络加载;并通过监听列表滚动事件,在列表底部添加加载动画实现上拉加载更多功能。代码示例清晰实用,适用于商城等含列表交互的移动应用开发。
鸿蒙Next仓颉开发语言中的数据类型总结分享
仓颉语言数据类型包括多种数字类型(Int、Float)、字符串(String)、数组(Array、ArrayList、ObservedArrayList)及HashMap。数字类型区分长度和精度,数组支持固定与动态操作,HashMap用于存储键值对。适合开发者快速掌握仓颉基础数据结构。#仓颉 #HarmonyOS
|
23天前
详解鸿蒙Next仓颉开发语言中的全屏模式
仓颉开发语言实现全屏模式教程:默认非全屏,需手动设置沉浸模式以占满屏幕。通过`setWindowLayoutFullScreen`开启全屏,并利用`getWindowAvoidArea`获取摄像头与导航条区域高度,结合AppStorage保存尺寸,适配界面布局,避免内容被遮挡。附屏幕尺寸获取方法及单位说明。
鸿蒙Next仓颉语言开发实战教程:聊天列表
本文分享了 HarmonyOS 仓颉语言实现聊天页面布局的全过程,包括顶部导航栏、动态消息列表及底部输入框的设计与代码实现,详细讲解了上中下结构布局、消息方向区分、阴影设置等内容。
|
23天前
鸿蒙Next仓颉语言开发实战教程:消息列表
本教程分享了使用仓颉语言开发商城应用中的消息列表页面,包含导航栏布局、消息筛选列表及消息内容列表的实现。通过Row、Scroll、List和ForEach等组件,完成页面结构搭建与数据循环渲染,适合初学者实战练习。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问