HarmonyOS File和base64字符串轉換

1. HarmonyOS File和base64字符串轉換

1.1. Base64

1.1.1. Base64認知

??Base64 是一種基于64個 ASCII 字符來表示二進制數據的表示方法,這個64個不同的字符為:
??(1)大、小寫字母(A– Z、a–z)。52個
??(2)數字。(0–9)10個
??(3)兩個特殊字符。(+、/)2個
在這里插入圖片描述

1.1.2. Base64原理

??(1)將圖片轉換成二進制數據。
??(2)將8比特位為一個單元的字節數據拆分為以6個比特位為一個單元的字節數據。
??(3)將6個比特位為一個單元高位補齊00,補足8個比特。
??(4)如果剩余的字節不足6位,則先低位補00湊齊6位之后,高位再補00,補足8位。
??(5)當未編碼(1中的二進制數據)輸入的長度不是三的倍數時,則編碼輸出(3)必須添加填充,使其長度為四的倍數。填充字符為=
??(6)將補齊8個比特的二進制數據,轉化為10進制數據。然后到上面的base64碼表中進行查詢,并生成字符。
??(7)將所有的字符進行拼接組成base64字符串。

1.1.3. 舉例說明

??比如字符串:“byhk”
??(1)將其轉換為二進制數據:01100010、01111001、01101000、01101011
??(2)將8比特拆為6比特:011000,100111,100101,101000,011010,11
??(3)高位補齊00,補足8個比特:0011000,0100111,00100101,00101000,00011010,00110000,
??(4)最后的11不滿6位,先低位補0000變為:110000,然后高位補00,變為:00110000
??(5)步驟3,最后的數量不是4的倍數,因此需要填充兩個=
??(6)因此"byhk"的base64的結果為:“Ynloaw==”
鴻蒙base64圖片保存到本地沙盒

1.2. 保存base64圖片到本地沙盒

??圖片base64格式

data:image/png;base64,iVBORw0KGg....

1.2.1. 解析圖片數據

private static dealBase64Str(base64Data: string): string {let imageData: stringif (base64Data.startsWith("data")) {const base64Split: string[] = base64Data.split(",")if (base64Split.length !== 2) {throw new Error(`Illegal base64 data`)}imageData = base64Split[1].trim()} else {imageData = base64Data}return imageData
}

1.2.2. 創建沙盒文件

private static createFile(context: Context) {let pathDir = context.filesDirlet fileName = systemDateTime.getTime(true)let filePath = `${pathDir}/${fileName}.jpg`let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)return file
}

1.2.3. 將圖片數據寫入

let bufferImage = buffer.from(base64Result, 'base64')
await fs.write(file.fd, bufferImage.buffer)
fs.closeSync(file.fd)

1.2.4. 完整代碼

export class ImageUtils {static async saveBase64Image(base64ImageData: string, context: Context): Promise<Boolean> {try {let base64Result = ImageUtils.dealBase64Str(base64ImageData)let file = ImageUtils.createFile(context)let bufferImage = buffer.from(base64Result, 'base64')await fs.write(file.fd, bufferImage.buffer)fs.closeSync(file.fd)return Promise.resolve(true)} catch (e) {throw new Error(e)}}private static dealBase64Str(base64Data: string): string {let imageData: stringif (base64Data.startsWith("data")) {const base64Split: string[] = base64Data.split(",")if (base64Split.length !== 2) {throw new Error(`ImageUtils: Illegal base64 data`)}imageData = base64Split[1].trim()} else {imageData = base64Data}return imageData}private static createFile(context: Context) {let pathDir = context.filesDirlet fileName = systemDateTime.getTime(true)let filePath = `${pathDir}/${fileName}.jpg`let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)return file}
}

1.3. 從網頁打開獲取文件,并轉成base64

1.3.1. 鴻蒙原生代碼

import web_webview from '@ohos.web.webview';
import picker from '@ohos.file.picker';
import { BusinessError } from '@ohos.base';
import { fileIo } from '@kit.CoreFileKit';
import util from '@ohos.util';@Entry
@Component
struct UploadFile {controller:web_webview.WebviewController = new web_webview.WebviewController();@State uri: Array<string> | null = null;// // 將 ArrayBuffer 轉換為 Base64 字符串// arrayBufferToBase64(buffer: ArrayBuffer): string {//   let binary = '';//   const bytes = new Uint8Array(buffer);//   for (let i = 0; i < bytes.byteLength; i++) {//     binary += String.fromCharCode(bytes[i]);//   }//   return globalThis.btoa(binary); // 使用 btoa 將二進制數據編碼為 Base64// }//// btoa(binaryData: Uint8Array) {//   // 創建一個Base64Helper實例//   let base64Helper = new util.Base64Helper();//   // 使用Base64Helper將二進制數據轉換為Base64編碼的字符串//   return base64Helper.encodeToStringSync(new Uint8Array(binaryData));// }build() {Column(){Text('選中的圖片')List(){ForEach(this.uri,(item:string)=>{ListItem(){Row(){Image(item).width('30vh').height('30vh')}}.width('30vh').height('30vh')})}.width('30vh').height('30vh')Web({src:$rawfile('setAttrAndEvent/uploadFile/index.html'),controller:this.controller}).fileAccess(false).width('100%').height('100vh').backgroundColor('grey').onShowFileSelector((event)=>{console.log('MyFileUploader onShowFileSelector invoked')let PhotoSelectOptions = new picker.PhotoSelectOptions();PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;// PhotoSelectOptions.maxSelectNumber = 5;PhotoSelectOptions.maxSelectNumber = 1;const photoPicker  = new picker.PhotoViewPicker();photoPicker .select(PhotoSelectOptions).then(async (photoSelectResult) => {this.uri = photoSelectResult.photoUris;console.info('photoPicker .select to file succeed and photoSelectResult is:' + JSON.stringify(photoSelectResult));console.info('photoPicker .select to file succeed and uri is:' + this.uri);if (this.uri.length > 0) {let oneUri = this.uri[0]// let uri: string = ''; // 這里應該是你的URIlet file = fileIo.openSync(oneUri, fileIo.OpenMode.READ_ONLY);console.info('file fd: ' + file.fd);let stat = await fileIo.stat(file.fd);// let buffer = new ArrayBuffer(4096);console.info('readSync data to file succeed and buffer size is: stat' + stat.size)let buffer = new ArrayBuffer(stat.size);let readLen = fileIo.readSync(file.fd, buffer);console.info('readSync data to file succeed and buffer size is:' + readLen);fileIo.closeSync(file);console.info('readSync data to file succeed and buffer size is: buffer 大小 ' + buffer.byteLength)// 創建一個Base64Helper實例let base64Helper = new util.Base64Helper();// 使用Base64Helper將二進制數據轉換為Base64編碼的字符串let base64Data = base64Helper.encodeToStringSync(new Uint8Array(buffer.slice(0, readLen)));// let base64Data = btoa(String.fromCharCode(...new Uint8Array(buffer.slice(0, readLen-1))));console.info('Base64 encoded data: ' + base64Data);}if (event) {event.result.handleFileList(this.uri);}}).catch((err: BusinessError) => {console.error(`Invoke photoPicker .select failed, code is ${err.code}, message is ${err.message}`);})return true;})}}
}

1.3.2. 關鍵代碼

   if (this.uri.length > 0) {let oneUri = this.uri[0]// let uri: string = ''; // 這里應該是你的URIlet file = fileIo.openSync(oneUri, fileIo.OpenMode.READ_ONLY);console.info('file fd: ' + file.fd);let stat = await fileIo.stat(file.fd);// let buffer = new ArrayBuffer(4096);console.info('readSync data to file succeed and buffer size is: stat' + stat.size)let buffer = new ArrayBuffer(stat.size);let readLen = fileIo.readSync(file.fd, buffer);console.info('readSync data to file succeed and buffer size is:' + readLen);fileIo.closeSync(file);console.info('readSync data to file succeed and buffer size is: buffer 大小 ' + buffer.byteLength)// 創建一個Base64Helper實例let base64Helper = new util.Base64Helper();// 使用Base64Helper將二進制數據轉換為Base64編碼的字符串let base64Data = base64Helper.encodeToStringSync(new Uint8Array(buffer.slice(0, readLen)));// let base64Data = btoa(String.fromCharCode(...new Uint8Array(buffer.slice(0, readLen-1))));console.info('Base64 encoded data: ' + base64Data);}

1.3.3. html代碼

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body>
<div class="upload"><!--  點擊上傳按鈕   --><form id="upload-form" enctype="multipart/form-data"><input type="file" id="upload" name="upload"/></form>
</div>
</body>
</html>
<style>body{width:100%;height:auto;margin:50px auto;text-align:center;background-color:#2EB3FF}
</style>

1.4. 在線圖片轉為base64字符串

let OutData: http.HttpResponse
http.createHttp().request("https://xxx/xxx.png",//在線圖片地址
(error: BusinessError, data: http.HttpResponse) => {
if (error) {
console.error(`http reqeust failed with. Code: ${error.code}, message: ${error.message}`);
} else {
OutData = data
let code: http.ResponseCode | number = OutData.responseCode
if (ResponseCode.ResponseCode.OK === code) {
let imageData: ArrayBuffer = OutData.result as ArrayBuffer;
let base64 = new util.Base64Helper(); // 實例化Base64Helper
let data = base64.encodeSync(new Uint8Array(imageData.slice(0, imageData.byteLength))) // 轉換成Uint8Array
console.info(`data長度:${data.length}`)
console.info(`data:${data}`)
let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM : true })
let retStr = textDecoder.decodeWithStream( data , {stream: false}); // 可以把Uint8Array轉碼成base64
}
}
}
)

1.5. 參考文檔

??(1)文件下載上傳:https://developer.huawei.com/consumer/cn/doc/system-Guides/network-exp-file-0000001093424975#section492510893519
??(2)載到公共目錄
在沙箱目錄里,在手機里看不到的。下載到公共目錄可參考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/request-dir-permission
??(3)預覽文件
您可參考previewKit:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/preview-introduction
??(4)Preview Kit的openPreview接口在傳入文件預覽信息時,當前僅支持傳入文件的uri,用戶文件uri介紹參考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/user-file-uri-intro-V5
??(5)打開和保存PDF文檔:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/pdf-open-docunent
??(6)@ohos.file.picker (選擇器):https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87071.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87071.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87071.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【NodeJs】【npm】npm安裝electron報錯

解決問題 npm安裝electron報錯一般來說是鏡像源的問題。 electron的鏡像源與一般的 vue 之類的鏡像源地址不一樣需要單獨配置。 npm讀取的全局配置一般是在 C:\Users\{用戶}\.npmrc 這個配置文件中。 如果你找不到你的配置文件可以執行如下命令, # 執行后會直接用txt打開你的…

植物small RNA靶基因預測軟件,psRobot

psRoto軟件安裝 網址 http://omicslab.genetics.ac.cn/psRobot/downloads.php下載和安裝 wget http://omicslab.genetics.ac.cn/psRobot/program/WebServer/psRobot_v1.2.tar.gz # tar -zxvf psRobot_v1.2.tar.gz # cd psRobot_v1.2 ## ./configure make make installpsRot…

翻譯服務器

基于UDP編程博客里的回顯服務器代碼,翻譯服務只需要改process方法即可 所以我們可以創建一個UdpDictServer直接繼承UdpEchoServer然后重寫process方法 在重寫的方法中完成翻譯的過程 代碼: package network;import java.io.IOException; import java.net.SocketException; …

初等變換 線性代數

初等變換 介紹了三種初等變換的操作。 初等矩陣 初等矩陣是干嘛的呢&#xff1f;實際上初等矩陣就是我們矩陣的初等操作&#xff0c;每一個對矩陣的初等變換操作都相當于乘上一個初等矩陣。 左乘初等矩陣就相當于對行進行初等操作&#xff0c;右乘則相當于對列進行初等操作。…

Java基礎 集合框架 隊列架構 雙端隊列 Deque

雙端隊列 Deque Deque 方法簡介Deque 核心特點Deque實現類 ArrayDequeArrayDeque 構造方法ArrayDeque 的數據結構及實現原理ArrayDeque 方法介紹ArrayDeque 核心特性ArrayDeque 總結ArrayDeque 使用樣例代碼 Deque實現類 LinkedListDeque實現類 ConcurrentLinkedDeque (非阻塞線…

【Spring】——事務、整合、注解

目錄 一.Spring與mybatis的整合 1.配置文件 ?編輯2. 二.事務 1.事務屬性 2.傳播屬性 3.異常屬性 4.常見配置 三.注解 1.什么是注解 2.Autowired 1.用戶自定義注解 ?編輯?編輯2.JDK類型注入value 3.Bean 1.對象的創建 2.對象創建次數 3.Bean注解的注入 1.自…

Linux 離線下安裝gcc、g++

描述 離線時編譯Redis、nginx等編譯包&#xff0c;需要gcc安裝包&#xff0c;評論提醒我 上傳補充 操作 1、進入gcc目錄&#xff0c;并執行安裝命令 rpm -ivh *.rpm --nodeps --force查看版本 gcc -v2、進入gcc-c目錄&#xff0c;并執行安裝 rpm -ivh *.rpm --nodeps --f…

融智學定律3:流動創造價值僅當跨域協同

關鍵公式意義&#xff1a; 人流方程中的 α/β 反映城市吸引力不對稱性 物流優化中的 η 實現時間價值貨幣化 金流模型的 σ(?) 捕捉市場情緒突變點 信息熵的 ∥gi??gj?∥ 度量知識勢差驅動 當五流在黎曼流形上滿足 ?_μ?T^μν0&#xff08;能量動量守恒&#xff09…

趣味數據結構之——數組

你們一定都聽說過它的故事…… 是的沒錯&#xff0c;就是一個蘿卜一個坑。??? 想象一下數組就是那個坑&#xff0c;那么定義數組就是在挖坑。 元素就是蘿卜。 坑就在那里(地上)&#xff0c;整整齊齊地排在那里。 于是數組最重要的一個特性就顯現出來了——隨機存取。還…

PR-2025《Scaled Robust Linear Embedding with Adaptive Neighbors Preserving》

核心思想分析 這篇論文的核心思想在于解決線性嵌入&#xff08;linear embedding&#xff09;與非線性流形結構之間的不匹配問題。傳統方法通過保留樣本點間的親和關系來提取數據的本質結構&#xff0c;但這種方法在某些情況下無法有效捕捉到數據的全局或局部特性。此外&#…

Redis-漸進式遍歷

之前使用的keys查找key,一次獲取到了所有的key,當key較多時,這個操作就有可能造成Redis服務器阻塞.特別是keys *操作. 于是可以通過漸進式遍歷,每次獲取部分key,通過多次遍歷,既查詢到了所有的key,又不會卡死服務器. 漸進式遍歷不是通過一個命令獲取到所有元素的,而是由一組命…

ISP Pipeline(3):Lens Shading Correction 鏡頭陰影校正

上一篇文章講的是&#xff1a;ISP Pipeline&#xff08;2&#xff09;&#xff1a; Black Level Compensation:ISP Pipeline&#xff08;2&#xff09;&#xff1a;Black Level Compensation 黑電平補償-CSDN博客 視頻&#xff1a;(4) Lens Shading Correction | Image Signal…

什么是WebAssembly(WASM)

WebAssembly&#xff08;WASM&#xff09; 是一種高性能的低級編程語言字節碼格式&#xff0c;可在網頁和非網頁環境中運行&#xff0c;支持多語言編譯&#xff0c;運行速度接近原生代碼。它在區塊鏈中的作用是&#xff1a;作為智能合約的執行引擎&#xff0c;被多條非以太坊鏈…

【C++】inline的作用

一、inline的作用 1.1函數內聯 作用?&#xff1a;建議編譯器將函數調用替換為函數體代碼&#xff0c;減少函數調用的開銷&#xff08;壓棧/跳轉&#xff09;。?注意?&#xff1a;這只是對編譯器的建議&#xff0c;編譯器可能忽略&#xff08;如函數體過大或遞歸&#xff0…

代碼隨想錄|圖論|04廣度優先搜索理論基礎

廣搜的使用場景 廣搜的搜索方式就適合于解決兩個點之間的最短路徑問題。 因為廣搜是從起點出發&#xff0c;以起始點為中心一圈一圈進行搜索&#xff0c;一旦遇到終點&#xff0c;記錄之前走過的節點就是一條最短路。 當然&#xff0c;也有一些問題是廣搜 和 深搜都可以解決…

Xposed框架深度解析:Android系統級Hook實戰指南

引言:Android系統定制化的革命性突破 在移動安全研究和系統優化領域,傳統的APP修改方案面臨??三重技術瓶頸??: ??逆向工程壁壘??:APK重打包方案需處理簽名校驗、代碼混淆等防護,平均耗時增加200%??兼容性挑戰??:Android碎片化導致設備適配率不足65%??功能…

大模型在通訊網絡中的系統性應用架構

一、網絡架構智能化重構?? ??1.1 空天地一體化組網優化?? 智能拓撲動態調整??&#xff1a;大模型通過分析衛星軌道數據、地面基站負載及用戶分布&#xff0c;實時優化天地一體化網絡拓撲。例如&#xff0c;在用戶密集區域&#xff08;如城市中心&#xff09;自動增強低…

軟件測試進階:Python 高級特性與數據庫優化(第二階段 Day6)

在掌握 SQL 復雜查詢和 Python 數據庫基礎操作后&#xff0c;第六天將深入探索Python 高級編程特性與數據庫性能優化。通過掌握 Python 的模塊與包管理、裝飾器等高級語法&#xff0c;結合數據庫索引優化、慢查詢分析等技術&#xff0c;提升測試工具開發與數據處理效率。 一、…

【NLP】自然語言項目設計04

目錄 04模型驗證 代碼架構核心設計說明 05運行推理 代碼架構核心設計說明 項目展望 項目簡介 訓練一個模型&#xff0c;實現歌詞仿寫生成 任務類型&#xff1a;文本生成&#xff1b; 數據集是一份歌詞語料&#xff0c;訓練一個模型仿寫歌詞。 要求 1.清洗數據。歌詞語料…

數據結構1 ——數據結構的基本概念+一點點算法

數據結構算法程序設計 什么是數據結構 數據&#xff08;data&#xff09;&#xff1a;符號集合&#xff0c;處理對象。 數據元素&#xff08;data element&#xff09;&#xff0c;由數據項&#xff08;data item&#xff09; 組成。 關鍵字&#xff08;key&#xff09;識別…