HarmonyOSNext 端云一体化(5)

[复制链接]
发表于 2025-10-14 10:02:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
HarmonyOSNext 端云一体化(5)

上一章节我们紧张解说了查询条件-谓词的根本利用本事。这一章我们紧张来解说下客户端操纵云存储。
云存储先容

云储存就是提供了一个可以存储物理文件的云端情况,好比存储图片、视频、音乐等,同时提供了的客户端操纵云存储、云函数操纵云存储的本事。我们这里紧张解说客户端操纵存储,后续会解说云函数操纵云存储。
云存储的计费计谋

免费配额

开通云存储服务后,华为供了免费额度以供试用,具体的配额明细如下。
计费项具体阐明免费配额存储存储数据的容量,以小时为统计周期,UTC 时间整点结算,单位为 GB。5GB 注意“存储”为按月计费,而非一次性计费。如果您利用的存储容量每月都凌驾免费配额,您每月都需付出相应的超额费用。比方,本月您利用了 6GB 存储容量,则本月您需付出 1GB 的超额费用。如果下个月您服务的存储容量为 7GB,下个月您仍需付出 2GB 的超额费用。网络出站流量公网流出流量,即通过互联网从云存储下载数据产生的流量。1GB/天上传操纵次数上传接口哀求次数。20,000/天下载操纵次数下载接口哀求次数。50,000/天每个项目多个存储实例单个项目支持创建多个存储实例。免费档不支持此功能  以某工具类 APP 为例,月新增下载量近 1w,云存储提供的免费配额完万能支持 APP 一样平常的调用。
  升级到按量付费档

当统计周期内的免费配额即将用尽时,您可以选择升级到按量付费档,以继续利用服务。大概,您也可以比及下个统计周期再利用云存储服务,在此之前服务将不再可用。
云存储按量付费代价如下表所示,套餐升级操纵请拜见升级到付费档。
计费项具体阐明按量付费代价存储存储数据的容量,以小时为统计周期,UTC 时间整点结算,单位为 GB。CNY 0.1679/GB网络出站流量公网流出流量,即通过互联网从云存储下载数据产生的流量。CNY 0.7751/GB上传操纵次数上传接口哀求次数。CNY 0.323/10,000下载操纵次数下载接口哀求次数。CNY 0.0258/10,000每个项目多个存储实例单个项目支持创建多个存储实例。按量付费档支持此功能云存储焦点功能

客户端操纵存储的焦点功能紧张有以下。


  • 上传文件到云端
  • 查察云端文件列表
  • 查察云端文件元数据
  • 设置云端文件数据
  • 获取云端文件下载地点
  • 下载云端文件到本地
  • 删除云端文件
接下来我们便开始对云存储举行操纵。
预备情况

开通云存储

我们必要提前在 AGC 平台上开通云存储情况。

我们可以看到,这个的云存储的实例名称为 default-bucket-xxxx
初始化云存储实例

由于后期要操纵云存储都必要用到云存储实例。以是必要初始化好。
利用默认云存储实例

  1. bucket: cloudStorage.StorageBucket = cloudStorage.bucket(); // 获取默认的存储实例
复制代码
指定云存储实例

  1. bucket: cloudStorage.StorageBucket = cloudStorage.bucket("default-bucket-xxxx"); // 获取默认的存储实例
复制代码
上传文件到云端

上传文件到云端只能调用StorageBucket.uploadFile方法,但是该方法要求上传的文件路径必须存放在context.cacheDir目次下。因
此必要先提前做好这个处理处罚。
步调:

  • 选择待上传的文件,下方示例代码中利用photoAccessHelper.PhotoViewPicker指定必要上传的文件。
  • 将待上传的文件复制到 context.cacheDir 目次下。
  • 调用StorageBucket.uploadFile接口创建上传使命,监听上传使命的 progress、completed、failed 等变乱。
  • 启动上传使命。
   uploadFile 在上传文件时,还支持上传自界说的尺度的 http 头部信息。具体可以查察 API 阐明
  示例代码:
  1. fn8 = async () => {
  2.     // 使用photoAccessHelper选择指定的文件
  3.     let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
  4.     // 设置媒体文件类型为图像
  5.     photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
  6.     // 设置选择媒体文件的最大数目为1
  7.     photoSelectOptions.maxSelectNumber = 1;
  8.     let photoViewPicker = new photoAccessHelper.PhotoViewPicker();
  9.     // 调用select方法选择图片,并处理选择结果
  10.     photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
  11.       // 获取选中文件的URI
  12.       let fileUri = photoSelectResult.photoUris[0];
  13.       console.info(`pick file ${fileUri}`);
  14.       // 提取文件名
  15.       let fileName = fileUri.split('/').pop() as string;
  16.       console.info(`file name ${fileName}`);
  17.       // 创建缓存文件名,以当前时间戳和原文件名组合
  18.       let cacheFile = `${Date.now()}_${fileName}`;
  19.       console.info(`cacheFile ${cacheFile}`);
  20.       // 拼接缓存文件路径
  21.       let cacheFilePath = getContext().cacheDir + '/' + cacheFile;
  22.       // 将选中文件复制到缓存目录下,文件名为cacheFile
  23.       try {
  24.         // 打开源文件
  25.         let srcFile = fs.openSync(fileUri);
  26.         // 打开目标文件(创建或读写)
  27.         let dstFile = fs.openSync(cacheFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  28.         // 复制文件内容
  29.         fs.copyFileSync(srcFile.fd, dstFile.fd);
  30.         // 关闭源文件
  31.         fs.closeSync(srcFile);
  32.         // 关闭目标文件
  33.         fs.closeSync(dstFile);
  34.       } catch (e) {
  35.         console.info(`copy file failed ${e.message}`);
  36.         return;
  37.       }
  38.       // 使用默认实例上传文件至云存储
  39.       this.bucket.uploadFile(getContext(this), {
  40.         // 本地文件路径,位于context.cacheDir目录下
  41.         localPath: cacheFile,
  42.         // 云端存储路径
  43.         cloudPath: fileName
  44.       }).then((task: request.agent.Task) => {
  45.         // 监听任务进度
  46.         task.on('progress', (progress) => {
  47.           console.info(`on progress ${JSON.stringify(progress)}`);
  48.         });
  49.         // 监听任务完成
  50.         task.on('completed', (progress) => {
  51.           console.info(`on completed ${JSON.stringify(progress)}`);
  52.         });
  53.         // 监听任务失败
  54.         task.on('failed', (progress) => {
  55.           console.error(`on failed ${JSON.stringify(progress)}`);
  56.         });
  57.         // 监听任务响应
  58.         task.on('response', (response) => {
  59.           console.info(`on response ${JSON.stringify(response)}`);
  60.         });
  61.         // 启动任务,并处理启动结果
  62.         task.start((err: BusinessError) => {
  63.           if (err) {
  64.             console.error(`Failed to start the uploadFile task, Code: ${err.code}, message: ${err.message}`);
  65.           } else {
  66.             console.info(`Succeeded in starting a uploadFile task.`);
  67.           }
  68.         });
  69.       }).catch((err: BusinessError) => {
  70.         console.error(`uploadFile failed, Code: ${err.code}, message: ${err.message}`);
  71.       });
  72.     })
  73. }
  74.       Button("计算8 上传文件到云端")
  75.         .onClick(this.fn8)
复制代码
革新 AGC-中的云存储: 可以看到文件乐成上传了。

查察云端文件列表

如果想要获取云端文件列表,可以利用 StorageBucket.list API。
参数

参数名范例必填阐明cloudPathstring是云侧文件路径。optionsListOptions否罗列操纵的干系参数。ListOptions
名称范例只读可选阐明maxResultsnumber否是罗列文件的最大数量,取值范围 1-1000,默认则罗列全部文件。pageMarkerstring否是分页标识。返回内容

名称范例只读可选阐明directoriesstring[]否否罗列操纵返回的云侧目次列表。filesstring[]否否罗列操纵返回的云侧文件列表。pageMarkerstring否是分页标识。示例代码

  1. fn9 = async () => {
  2.   try {
  3.     const res = await this.bucket.list(""); // 获取根据根路径
  4.     // const res = await this.bucket.list('avatar/') // 获取 avatar/ 路径下的文件。 需要注意的是 如果你输入的路径是 ava ,那么 avatar也会被匹配到
  5.     AlertDialog.show({ message: JSON.stringify(res, null, 2) });
  6.   } catch (e) {
  7.     promptAction.showToast({ message: `${e.message} ${e.code}` });
  8.   }
  9. };
  10. Button("计算9 获取云端文件列表").onClick(this.fn9);
复制代码
得到结果


查察云端文件元数据

我们可以通过该StorageBucket.getMetadataAPI 获取到文件名、文件巨细、文件范例等常用属性,也包罗用户自界说的文件属性。
参数

参数名范例必填阐明cloudPathstring是云侧文件路径。返回值

范例阐明Promise<Metadata>Promise 对象,返回云侧文件的元数据信息。示例代码

  1. fn10 = async () => {
  2.   try {
  3.     const res = await this.bucket.list("");
  4.     const cloudFilePath = res.files[0]; // 获取第一个文件 -  实际开发中,你需要明确该路径下一定存在文件
  5.     const res2 = await this.bucket.getMetadata(cloudFilePath);
  6.     AlertDialog.show({ message: JSON.stringify(res2, null, 2) });
  7.   } catch (e) {
  8.     promptAction.showToast({ message: `${e.message} ${e.code}` });
  9.   }
  10. };
  11. Button("计算10 查看云端文件元数据").onClick(this.fn10);
复制代码
得到结果


获取云端文件下载地点

我们之前通过getMetadata获取到了云端文件的干系信息。但是如果该文件是图片,而我们想要利用 Image 体现该图片,那么还必要利用StorageBucket.getDownloadURL获取到该文件的下载地点。
参数

参数名范例必填阐明cloudPathstring是云侧文件路径。返回值

范例阐明Promise<string>Promise 对象,返回云侧文件下载地点。示例代码

  1. fn11 = async () => {
  2.   try {
  3.     const res = await this.bucket.list("");
  4.     const cloudFilePath = res.files[0]; // 获取第一个文件 -  实际开发中,你需要明确该路径下一定存在文件
  5.     const res2 = await this.bucket.getDownloadURL(cloudFilePath);
  6.     AlertDialog.show({ message: JSON.stringify(res2, null, 2) });
  7.   } catch (e) {
  8.     promptAction.showToast({ message: `${e.message} ${e.code}` });
  9.   }
  10. };
  11. Button("计算11 获取云端文件下载地址").onClick(this.fn11);
复制代码
得到结果


下载云端文件到本地

利用 StorageBucket.downloadFile 可以将文件下载到 ontext.cacheDir 目次下。
参数

参数名范例必填阐明contextcommon.BaseContext是应用上下文。parametersDownloadParams是下载干系参数。DownloadParams
名称范例只读可选阐明localPathstring否否本地文件路径,根路径为 cache 目次。cloudPathstring否否云侧文件路径。moderequest.agent.Mode否是下载使命范例,前端使命在应用切换到背景一段时间后失败/停息;背景使命不受影响。默以为 BACKGROUND。BACKGROUND:背景使命。FOREGROUND:前端使命。overwriteboolean否是当本地文件已存在时,是否覆盖本地文件,默认 false。true:覆盖本地文件。false:不覆盖,若存在同名文件则下载失败。networkrequest.agent.Network否是下载使命的网络设置,网络不满意设置条件时,未实验的使命等候实验,实验中的使命失败/停息。默以为 ANY。ANY:不限网络范例。WIFI:无线网络。CELLULAR:蜂窝数据网络。返回值

范例阐明Promise<[Task]>Promise 对象,返回下载使命。示例代码

  1. fn12 = async () => {
  2.   try {
  3.     const res = await this.bucket.list("");
  4.     const cloudFilePath = res.files[0]; // 获取第一个文件 -  实际开发中,你需要明确该路径下一定存在文件
  5.     const task = await this.bucket.downloadFile(getContext(this), {
  6.       localPath: Date.now().toString(), // 本地文件路径, 下载成功后,文件将会保存在context.cacheDir目录
  7.       cloudPath: cloudFilePath, // 云侧文件路径
  8.     });
  9.     task.on("progress", (progress) => {
  10.       console.info(`on progress ${JSON.stringify(progress)} `);
  11.     });
  12.     task.on("completed", (progress) => {
  13.       console.info(`on completed ${JSON.stringify(progress)} `);
  14.       AlertDialog.show({ message: JSON.stringify("下载完成", null, 2) });
  15.     });
  16.     task.on("failed", (progress) => {
  17.       console.error(`on failed ${JSON.stringify(progress)} `);
  18.     });
  19.     task.on("response", (response) => {
  20.       console.info(`on response ${JSON.stringify(response)} `);
  21.     });
  22.     task.start((err: BusinessError) => {
  23.       if (err) {
  24.         console.error(
  25.           `Failed to start the downloadFile task, Code: ${err.code}, message: ${err.message}`
  26.         );
  27.       } else {
  28.         console.info(
  29.           `Succeeded in starting a downloadFile task. result: ${task.tid}`
  30.         );
  31.       }
  32.     });
  33.   } catch (e) {
  34.     promptAction.showToast({ message: `${e.message} ${e.code}` });
  35.   }
  36. };
  37. Button("计算12 下载云端文件").onClick(this.fn12);
复制代码
得到结果


删除云端文件

调用StorageBucket.deleteFile删除云侧的文件。
参数

参数名范例必填阐明cloudPathstring是云侧文件路径。返回值

范例阐明Promise<void>Promise 对象。无返回结果的 Promise 对象。示例代码

  1.   fn13 = async () => {
  2.     try {
  3.       const res = await this.bucket.list('')
  4.       const cloudFilePath = res.files[0] // 获取第一个文件 -  实际开发中,你需要明确该路径下一定存在文件
  5.       await this.bucket.deleteFile(cloudFilePath)
  6.       promptAction.showToast({ message: `${"成功"}` })
  7.     } catch (e) {
  8.       promptAction.showToast({ message: `${e.message} ${e.code}` })
  9.     }
  10.   }
复制代码
得到结果


总结

本文具体先容了 HarmonyOS Next 中云存储的根本利用方法。紧张内容包罗:

  • 云存储底子

    • 先容了云存储的根本概念
    • 具体阐明白免费配额和计费计谋
    • 解说了云存储的焦点功能

  • 情况预备

    • 怎样在 AGC 平台开通云存储
    • 怎样初始化云存储实例,包罗默认实例和指定实例的利用

  • 焦点 API 利用

    • 文件上传:利用uploadFile将本地文件上传至云端
    • 文件列表:通过list获取云端文件列表
    • 元数据获取:利用getMetadata查察文件的具体信息
    • 下载地点:通过getDownloadURL获取文件的下载链接
    • 文件下载:利用downloadFile将云端文件下载到本地
    • 文件删除:通过deleteFile删除云端文件

  • 注意事项

    • 文件上传必须利用context.cacheDir目次
    • 文件下载同样只能生存在context.cacheDir目次下
    • 操纵云存储时必要注意错误处理处罚

通过本文的学习,开辟者可以把握 HarmonyOS Next 中云存储的根本操纵,为应用开辟中的文件存储需求提供办理方案。

如果你爱好想要相识更多的鸿蒙应用开辟细节和最新资讯,接待在品评区留言大概私信大概看我个人信息,可以到场技能互换群。
上传:利用uploadFile将本地文件上传至云端


  • 文件列表:通过list获取云端文件列表
  • 元数据获取:利用getMetadata查察文件的具体信息
  • 下载地点:通过getDownloadURL获取文件的下载链接
  • 文件下载:利用downloadFile将云端文件下载到本地
  • 文件删除:通过deleteFile删除云端文件

  • 注意事项

    • 文件上传必须利用context.cacheDir目次
    • 文件下载同样只能生存在context.cacheDir目次下
    • 操纵云存储时必要注意错误处理处罚

通过本文的学习,开辟者可以把握 HarmonyOS Next 中云存储的根本操纵,为应用开辟中的文件存储需求提供办理方案。

如果你爱好想要相识更多的鸿蒙应用开辟细节和最新资讯,接待在品评区留言大概私信大概看我个人信息,可以到场技能互换群。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表