【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…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...