鸿蒙HarmonyOS之选择相册文件(照片/视频)方法

一、新建文件工具类FileUtil.ets

包含:选择照片方法、获取文件类型方法、去除后缀、获取后缀方法

复制代码
import { BusinessError, request } from '@kit.BasicServicesKit';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import bundleManager from '@ohos.bundle.bundleManager';

/**
 * 选择图库图片
 * @param selectMax 选择文件数量限制
 * @param selectType 选择文件类型限制
 * @returns
 */
export async function fileSelect(selectMax: number,selectType: photoAccessHelper.PhotoViewMIMETypes): Promise<Array<string>> {
  try {
    // //选择图片的类型
    // let recommendOptions: photoAccessHelper.RecommendationOptions = {
    //   recommendationType: photoAccessHelper.RecommendationType.ID_CARD
    // }
    let options: photoAccessHelper.PhotoSelectOptions = {
      MIMEType: selectType,
      maxSelectNumber: selectMax,
      // recommendationOptions: recommendOptions
    }
    let photoPicker = new photoAccessHelper.PhotoViewPicker();

    // 使用 await 确保异步操作完成
    const PhotoSelectResult = await photoPicker.select(options);

    // 成功获取结果后返回字符串形式的结果
    console.info('PhotoViewPicker.select successfully, result is: ' + JSON.stringify(PhotoSelectResult));
    if (PhotoSelectResult && PhotoSelectResult.photoUris && PhotoSelectResult.photoUris.length > 0) {
      return PhotoSelectResult.photoUris;
    }else{
      return [];
    }
  } catch (error) {
    // 处理捕获到的错误,并返回空
    let err: BusinessError = error as BusinessError;
    console.error(`PhotoViewPicker failed with err: ${err.code}, ${err.message}`);
    return []; // 返回空
  }
}


/**
 * 获取文件类型
 * @param uri
 * @returns
 */
export function getFileTypeFromExtension(uri: string): 'image' | 'video' | 'unknown' {
  const fileName = uri.substring(uri.lastIndexOf('/') + 1);
  const fileExtension = fileName.split('.').pop()?.toLowerCase();

  if (fileExtension) {
    switch (fileExtension) {
      case 'jpg':
      case 'jpeg':
      case 'png':
      case 'bmp':
      case 'gif':
        return 'image';
      case 'mp4':
      case 'avi':
      case 'mov':
      case 'mkv':
        return 'video';
      default:
        return 'unknown';
    }
  }

  return 'unknown';
}

/**
 * 去除后缀的文件名
 * @param uri
 * @returns
 */
export function removeFileExtension(uri: string): string {
  const fileName = uri.substring(uri.lastIndexOf('/') + 1);
  const baseName = fileName.split('.').slice(0, -1).join('.');
  return uri.replace(fileName, baseName);
}

/**
 * 获取后缀
 * @param uri
 * @returns
 */
export function getFileExtensionWithDot(uri: string): string {
  const lastDotIndex = uri.lastIndexOf('.');
  if (lastDotIndex > -1) {
    return uri.substring(lastDotIndex);
  }
  return ''; // 如果没有找到后缀名,则返回空字符串
}

二、使用示例

1、选择一张图片文件

复制代码
fileSelect(1, photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE).then((uriArray: Array<string>) => {
          if (uriArray && uriArray.length > 0) {
            this.imageUri = uriArray[0];
            Logger.debug(this.TAG,'选择的图片Uri是:'+ this.imageUri)
          }else{
            Logger.debug(this.TAG,'未选择图片!')
            showToast('未选择图片!')
          }
        });

2、选择多个文件,不限图片或视频

复制代码
fileSelect(20, photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE)
        .then((uriArray: Array<string>) => {
          if (uriArray && uriArray.length > 0) {
            Logger.debug(this.TAG, '准备上传')
            for (let index = 0; index < uriArray.length; index++) {
              const itemUri = uriArray[index];
              let type: string = getFileTypeFromExtension(itemUri);
              let suffix: string = getFileExtensionWithDot(itemUri);
              Logger.debug(this.TAG, '选择照片的uri = ' + itemUri)
              Logger.debug(this.TAG, '文件类型是:' + type + ', 文件后缀是:' + suffix);
              //......
            }
          } else {
            Logger.debug(this.TAG, '未选择文件!')
            showToast('未选择文件!')
          }
        })

三、完成,Nice!

相关推荐
ChinaDragonDreamer3 天前
HarmonyOS:知识点总结(一)
harmonyos·鸿蒙
轩情吖3 天前
Qt的文件
开发语言·c++·qt·文件·qfileinfo·桌面级开发·qt文件操作
加农炮手Jinx4 天前
Flutter for OpenHarmony 实战:JWT — 构建安全的无状态认证中心
网络·flutter·华为·harmonyos·鸿蒙
雷帝木木4 天前
Flutter for OpenHarmony:Flutter 三方库 money2 — 坚不可摧的鸿蒙金融核心组件
网络·flutter·http·华为·金融·harmonyos·鸿蒙
特立独行的猫a4 天前
uniapp-x的HarmonyOS鸿蒙应用开发:tabbar底部导航栏的实现
华为·uni-app·harmonyos·鸿蒙·uniapp-x
●VON4 天前
HarmonyOS应用开发实战(基础篇)Day10 -《鸿蒙网络请求实战》
网络·学习·华为·harmonyos·鸿蒙·von
草莓熊Lotso5 天前
Ext 系列文件系统核心:块、分区、inode 与块组结构详解
android·linux·c语言·开发语言·c++·人工智能·文件
●VON5 天前
HarmonyOS应用开发实战(基础篇)Day08-《构建布局详解上》
华为·harmonyos·鸿蒙·von
加农炮手Jinx7 天前
Flutter for OpenHarmony 实战:疯狂头像 App(三)— 复合动画与交互反馈 — 让 UI 跃动起来
flutter·ui·交互·harmonyos·鸿蒙
_waylau8 天前
鸿蒙架构师修炼之道-架构师设计思维特点
华为·架构·架构师·harmonyos·鸿蒙·鸿蒙系统