【HarmonyOS NEXT】实现保存base64图片到图库
上篇文章介绍了HarmonyOS NEXT如何保存base64文件到download目录下,本次介绍如何保存base64图片到图库,网络图片保存方式大同小异,先下载图片,然后再保存
phAccessHelper.showAssetsCreationDialog
参考官方文档’
@ohos.file.photoAccessHelper (相册管理模块)-ArkTS API-Media Library Kit(媒体文件管理服务)-媒体 - 华为HarmonyOS开发者 (huawei.com)
完整代码如下
//模拟数据param ="{\"dataBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4QAAACiCAYAAAAZUwONAAAAAXNSR0IArs4c6QAAHWFJREFUeF7t3QusHFX9B/CDQdKqYCwiggELpjFS8IGaohXaYgCDBnxUbCUVovUFCKQxGvFZXokYIygGBTWFGGpiqtCYCohiiVURREUoj6YRW6BYKU2lAq0x/ec3cfY/d9m9u927OzO98znJTXt3Z+ac85lTki/nzJy9du3atSspBAgQIECAAAECBAgQINA4gb0Ewsbdcx0mQIAAAQIECBAgQIBAJiAQGggECBAgQIAAAQIECBBoqIBA2NAbr9sECBAgQIAAAQIECBAQCI0BAgQIECBAgAABAgQINFRAIGzojddtAgQIECBAgAABAgQICITGAAECBAgQIECAAAECBBoqIBA29MbrNgECBAgQIECAAAECBARCY4AAAQIECBAgQIAAAQINFRAIG3rjdZsAAQIECBAgQIAAAQICoTFAgAABAgQIECBAgACBhgoIhA298bpNgAABAgQIECBAgAABgdAYIECAAAECBAgQIECAQEMFBMKG3njdJkCAAAECBAgQIECAgEBoDBAgQIAAAQIECBAgQKChAgJhQ2+8bhMgQIAAAQIECBAgQEAgNAYIECBAgAABAgQIECDQUAGBsKE3XrcJECBAgAABAgQIECAgEBoDBAgQIECAAAECBAgQaKiAQNjQG6/bBAgQIECAAAECBAgQEAiNAQIECBAgQIAAAQIECDRUQCBs6I3XbQIECBAgQIAAAQIECAiExgABAgQIECBAgAABAgQaKiAQNvTG6zYBAgQIECBAgAABAgQEQmOAAAECBAgQIECAAAECDRUQCBt643WbAAECBAgQIECAAAECAqExQIAAAQIECBAgQIAAgYYKCIQNvfG6TYAAAQIECBAgQIAAAYHQGCBAgAABAgQIECBAgEBDBQTCht543SZAgAABAgQIECBAgIBAaAwQIECAAAECBAgQIECgoQICYUNvvG4TIECAAAECBAgQIEBAIDQGCBAgQIAAAQIECBAg0FABgbChN163CRAgQIAAAQIECBAgIBAaAwQIECBAgAABAgQIEGiogEDY0Buv2wQIECBAgAABAgQIEBAIazoGfvrTn6ZHHnkkfepTn6ppCzWLAAECBAgQIECAAIE9XUAgrOkdjEB4//33pwsuuKCmLdQsAgQIECBAgAABAgT2dAGBsKZ3UCCs6Y3RLAIECBAgQIAAAQKTSEAgrOnNrEMg3LBhQ/rRj36UfvnLX6aHHnoobd26NU2fPj3NmTMnLVy4MB1zzDFd9bZs2ZKWL1+ebrjhhvTAAw+kKVOmpNe97nVpwYIF6T3veU/ae++9ayqvWQQIECBAgAABAgSaIyAQ1vReVx0II8h96EMfSk899VQm9OEPfzi9/OUvT9dee2169NFHs88uvfTS9LnPfe45gmvXrk3vf//7U/wZZfbs2Wn79u3pL3/5S/Z7fPeDH/wgvehFL6qpvmYRIECAAAECBAgQaIaAQFjT+1xlIIxnF48++uj07LPPZjrXXHNNWrx4cfb3Bx98ML3lLW/JZguj3HLLLemEE05oKW7bti3NnTs3/fnPf84++/znP58uuuiitHPnzrRo0aL04x//OPs8XpbzzW9+s6b6mkWAAAECBAgQIECgGQICYU3vc5WB8Etf+lIW4qK84AUvSE888USaOnVqSypCXswORjnjjDPSsmXLWt9dddVV6ayzzsp+f/7zn582btyYDjzwwOz33/zmN+nYY49tHRszhq997Wtregc0iwABAgQIECBAgMDkFxAIa3qPqwyEp556alq5cmUmc9RRR6V77rlnjFI8G/jBD34w++xNb3pTuvPOO1vfv/71r28tDT3uuOPS6tWrW9/FstF999239Xu8QfWSSy6p6R3QLAIECBAgQIAAAQKTX0AgrOk9rjIQxgtj4mUyUSLAPfnkk2NeAhPPEZ555pnZ9/GCmJ/85CfZ3x9++OF02GGHtUTPOeec9K1vfWuMcATMe++9N/vsyCOPzMLmXnvtVdO7oFkECBAgQIAAAQIEJreAQFjT+1tlILzsssvSZz/72ZZMPPc3f/781u8f+9jHsucKo8Ry0Vg2GuXWW28d8zzhxRdfnD1DWCzvfOc706pVq1of/fOf/0wvfelLa3oXNIsAAQIECBAgQIDA5BYQCGt6f/sJhL/+9a/TvHnz+u7B448/3nqeb7yTHnvssezZvtg6IkrMEl599dXZ20Ej9L3jHe/IPv/EJz6RzQDmW0hcd911rXAY319++eXpvPPOG1PV6aefnq6//vrWZ3/6059SLDNVCBAgQIAAAQIECBAoX0AgLN+8rxr7CYS/+93v0sc//vG+rhcHxX6CBxxwQF/HR9iM2bynn366dfwb3/jG9Mc//jEddNBB2bN/MTP4vOc9r/V9hMNzzz239Xu8YCZCY7EUZxfj86gn9jVUCBAgQIAAAQIECBAoX0AgLN+8rxr7CYR9XWgCB/31r3/N9iLMt5DILxXPDX71q19NM2bMGHP19qWmMav40Y9+dMwx8QbSCIp5+fnPf96acZxAU51KgAABAgQIECBAgMAAAgLhAGhlnFJ1IHzmmWey4PaVr3yltTl9sd+xHcU3vvGNLPDlL4XpJxB+8pOfTN/5zndal7rpppvSSSedVAapOggQIECAAAECBAgQaBMQCGs6JKoMhLHvYCwHzV/+EnsOxrN/V155Zfra1742RixmCj/zmc9kn8X3seF8XjotGY0A+b3vfa91TGxLEdtTKAQIECBAgAABAgQIlC8gEJZvPm6N8UxdlK1bt6b7778/xV593cooniHctWtXtkz0hz/8YVZt7DcYf89nAdesWZM+8IEPpEcffbTVrPzFMHHcokWLWp93eqlMXC/2McyLzelrNgA1hwABAgQIECBAoFECAmENbncsy4yZsjwMRpMidMWbPscLhKN4y2i8NCY2m89Lp5e+3Hjjjend735365iYNfz0pz+dfvWrX6W3v/3trc8vuuii9IUvfGGM8Mknn5ziucG8xB6HL3nJS2pwFzSBAAECBAgQIECAQPMEBMIK73mEraVLl44JgsXmHH/88dmbQcsssSF9bEyflw0bNqRDDjlkTBN27NiRpk2b1noD6dlnn50tF924cWM69NBDW8fmnxdPnjlzZlq7dm32UWw3EbOLCgECBAgQIECAAAEC1QgIhNW4Z7XmyzC7NSG2ffjZz35WagtXrlyZTj311FadDzzwQHr1q189pg3//e9/0/7775+2bduWfR6zmLENRZQ3v/nN6a677sr+Hs8GxsxnXrZv357taZiXL37xi+nCCy8stX8qI0CAAAECBAgQIEDg/wUEwopGQywTjdnB8cptt92W5s6dW2oL//a3v6XDDz+8VWfMGMby1WKJGb6Y6ctLLCE95ZRTsl+vueaaFHsN5uXxxx9PBx54YPbr7bffPmbPwfvuuy8dccQRpfZPZQQIECBAgAABAgQICISVj4Fes4MRBCMQVlHiTaGxBDTKUUcdlT3z94pXvCL7/d///ndavHhxiqAY5dhjj0233npr2meffbLfYxZw3rx5rVnCmAWM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\",\"fileType\":\"png\",\"fileName\":\"\"}"if (StringUtils.isStrNotBlank(param)) {const h5CallBackBean: H5CallBackBean | null = JSONUtil.jsonToBean<H5CallBackBean>(H5CallBackBean, param)
//保存图片let context = getContext(this);let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);const fileBase64 = h5CallBackBean.dataBase64if (StringUtils.isStrNotBlank(fileBase64)) {const base64: string = fileBase64.split(",")[1]let applicationContext = getContext().getApplicationContext()const numTemp: number = DateUtil.getTodayTime()let filePath = applicationContext.filesDir + '/' + numTemp + "." + h5CallBackBean.fileTypeif (UiUtils.saveBase64File(base64, filePath)) {try {// 获取需要保存到媒体库的位于应用沙箱的图片/视频urilet srcFileUris: Array<string> = [fileUri.getUriFromPath(filePath)];let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [{fileNameExtension: 'jpg',photoType: photoAccessHelper.PhotoType.IMAGE,subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选}];let desFileUris: Array<string> =await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);console.info('showAssetsCreationDialog success, data is ' + desFileUris);if (desFileUris.length > 0) {FileUtil.copyFileSync(filePath,new fileUri.FileUri(desFileUris[0]).path)try {console.log(`context.fileDir ===> ${context.filesDir}`)let srcFile: fs.File = fs.openSync(fileUri.getUriFromPath(filePath), fs.OpenMode.READ_ONLY);let targetFile: fs.File = await fs.open(desFileUris[0], fs.OpenMode.READ_WRITE);let bufSize = 14096;let readSize = 0;let buf = new ArrayBuffer(bufSize);let readOptions: ReadOptions = { offset: readSize, length: bufSize };let readLen = fs.readSync(srcFile.fd, buf, readOptions);while (readLen > 0) {readSize += readLen;fs.writeSync(targetFile.fd, buf, { length: readLen });readOptions.offset = readSize;readLen = fs.readSync(srcFile.fd, buf, readOptions);}fs.closeSync(srcFile);fs.closeSync(targetFile);ToastUtil.showToast("保存成功")if (FileUtil.accessSync(filePath)) {FileUtil.unlink(filePath)}} catch (error) {console.error(`createAssetByIo :: error , msg is ${error} `);}} else {ToastUtil.showToast("您拒绝了保存图片")}} catch (err) {console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);}} else {ToastUtil.showToast("保存失败,请稍后重试")}}}}
其中用到的第三方依赖和上篇文章一致
参考:HarmonyNext保存Base64文件到Download下-CSDN博客
效果如下


【其它问题】
关于授权窗,没显示图片缩略图的问题,官方给的答复是下载最新版本的IDE
相关文章:
【HarmonyOS NEXT】实现保存base64图片到图库
上篇文章介绍了HarmonyOS NEXT如何保存base64文件到download目录下,本次介绍如何保存base64图片到图库,网络图片保存方式大同小异,先下载图片,然后再保存 phAccessHelper.showAssetsCreationDialog参考官方文档’ ohos.file.pho…...
开题答辩最怕被问什么?教你用ChatGPT轻松准备,稳拿高分!
AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 开题答辩是学位论文写作过程中的重要环节,能帮助导师评估你的研究计划是否可行,并对后续写作起到指导作用。很多同学在面对导师提问时会感到紧张,因此提前准备好常见问题的…...
Unity3D功耗和发热分析与优化详解
前言 Unity3D作为广泛使用的游戏开发引擎,在游戏开发过程中,功耗和发热问题一直是开发者需要重点关注的问题。功耗和发热不仅影响用户体验,还可能对设备的硬件寿命造成一定影响。本文将从技术角度详细分析Unity3D游戏在移动设备上的功耗和发…...
深度学习中的掩码介绍
在深度学习中,**掩码(Mask)**通常用于屏蔽掉某些特定部分的数据,以确保模型在训练或推理时不处理无效或无关的输入。掩码的使用场景主要包括处理变长序列、生成模型中的自回归任务、处理填充数据等。掩码可以是二值矩阵(1 表示有效数据,0 表示屏蔽数据),在注意力机制中…...
rust高级进阶总结
文章目录 前言1. Rust生命周期进阶一、不太聪明的生命周期检查(一)例子1(二)例子2 二、无界生命周期三、生命周期约束(HRTB)(一)语法及含义(二)综合例子 四、…...
整理—计算机网络
目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些? GET和POST的使用场景,有哪些区别? HTTP的长连接 HTTP默认的端口是什么? HTTP1.1怎…...
分布式数据库环境(HBase分布式数据库)的搭建与配置
分布式数据库环境(HBase分布式数据库)的搭建与配置 1. VMWare安装CentOS7.9.20091.1 下载 CentOS7.9.2009 映像文件1.2启动 VMware WorkstationPro,点击“创建新的虚拟机”1.3在新建虚拟机向导界面选择“典型(推荐)”1…...
100个JavaWeb(JDBC, Servlet, JSP)毕业设计选题
100个JavaWeb(JDBC, Servlet, JSP)毕业设计选题 教育行业 学生信息管理系统在线考试系统课程管理与选课系统教师评价管理系统图书馆管理系统学生成绩查询系统校园论坛作业提交与批改系统学生考勤管理系统教学资源共享平台 企业管理 员工管理系统考勤打卡系统办公用品申请管…...
05 go语言(golang) - 常量和条件语句
常量 在Go语言中,常量是使用 const 关键字定义的,并且一旦被赋值后,它们的值在程序运行期间不能改变。常量可以是字符、字符串、布尔或数值类型。 基本特性 不可修改:一旦一个常量被定义,它的值就不能被更新。编译时…...
【设计模式】深入理解Python中的适配器模式(Adapter Pattern)
深入理解Python中的适配器模式(Adapter Pattern) 在软件开发中,常常会遇到需要让不兼容的类或接口协同工作的问题。适配器模式(Adapter Pattern)是一种结构型设计模式,通过提供一个包装器对象,…...
RuoYi-Vue若依框架-后端设置不登陆访问(白名单)
找到SecurityConfig类 确认自己的需求 /*** anyRequest | 匹配所有请求路径* access | SpringEl表达式结果为true时可以访问* anonymous | 匿名可以访问* denyAll | 用户不能访问* fullyAuthenticated | 用户完全认证可…...
C语言初阶小练习2(三子棋小游戏的实现代码)
这是C语言小游戏三子棋的代码实现 test.c文件是用来测试的部分 game.h文件是用来声明我们说写出的函数 game.c文件是用来编写我们的功能实现函数部分 1.test.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() {printf("***************…...
金融行业合同管理如何利用AI技术进行风险预警?
2024年以来,金融行业的发展主线被锚定,强调了防风险的基调,尤其是系统性风险的防范。金融工作的重点在于实现六个强大:强大的货币、强大的中央银行、强大的金融机构、强大的国际金融中心、强大的金融监管、强大的金融人才队伍。这…...
世界数字农业盛宴与技术探索,25年3月聚焦世界灌溉科技大会
由中国农业节水和农村供水技术协会、中国农垦节水农业产业技术联盟、北京物联网智能技术应用协会、振威国际会展集团主办的“世界灌溉科技大会”、“第11届北京国际数字农业与灌溉技术博览会”,定于2025年3月31日至4月2日在北京国家会议中心举办。 作为世界三大灌溉…...
二百六十九、Kettle——ClickHouse清洗ODS层原始数据增量导入到DWD层表中
一、目的 清洗ClickHouse的ODS层原始数据,增量导入到DWD层表中 二、实施步骤 2.1 newtime select( select create_time from hurys_jw.dwd_statistics order by create_time desc limit 1) as create_time 2.2 替换NULL值 2.3 clickhouse输入 2.4 字段选择 2.5 …...
Maya---骨骼绑定
调节骨骼大小 回车键确认骨骼 FK子集跟父集走 IK子集不跟父集走 前视图中按shift键添加骨骼 清零、删除历史记录,创建新的物体...
携手并进,智驭教育!和鲸科技与智谱 AI 签署“101 数智领航计划”战略合作协议
近日,上海和今信息科技有限公司(以下简称“和鲸科技”)与北京智谱华章科技有限公司(以下简称“智谱 AI”)签署“101 数智领航计划”战略合作协议。双方将携手营造智能化学科教育与科研环境,提供多种大模型工…...
牛客周赛63
https://ac.nowcoder.com/acm/contest/91592 好数 简单的判断两位数,且十位等于个位 #include <bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define int long long using namespace std; using ll long long; using pii …...
git restore恢复删除文件
新版本 在 Git 2.23 版本之后,Git 引入了一个新的命令 git restore,用于简化文件恢复操作。可以用 git restore 来恢复误删除的文件。下面是详细的使用方法: 1. 恢复工作区中删除的文件(未提交) 如果文件已被删除&a…...
MacOS13虚拟机VMware Workstation Pro 16安装
资源 安装unlocker 安装虚拟机 低版本的还没有MacOS13选项,这也是我安装低版本虚拟机踩过的坑 找个教程安装就可以了 省略…自己去找找教程… 过程中我使用桥接是不行的,没有网络,后面重新下一步一步的选择默认的网络重装后就好了&am…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
