鴻蒙OSS文件(視頻/圖片)壓縮上傳組件-能夠增刪改查

?一、鴻蒙實現處理-壓縮上傳整體代碼處理邏輯

  1. 轉沙箱
  2. 壓縮
  3. 獲取憑證并上傳文件
    1. 文件準備(拿到文件流)
    2. 獲取上傳憑證(調接口1拿到file_name和upload_url)
    3. 執行文件上傳(向階段2拿到的upload_url上傳文件)
    4. 更新列表數據 (將階段2獲取到的file_name更新進去,最后提交表單時傳參)
  4. 提交表單
 // 處理視頻/圖片(轉沙箱、壓縮、調接口獲取url、上傳到OSS)// index不是undefined時:修改async handleFile(messageInfo: MessageInfo, index?: number) {loadingInstance.show()if (this.videoFlag) {// 1視頻處理// 1)轉沙箱const file = uriToSandBox(messageInfo.sourceFilePath);// 2)壓縮const fileUri = await this.videoToCompress(file.fileUri).catch(() => {loadingInstance.hide()showToast('視頻壓縮失敗');});let stat = fs.statSync(fileUri as string);if (stat.size / 1024 / 1024 > 50) {loadingInstance.hide()showToast('請拍攝50M以內的視頻');return;}// 3)獲取上傳憑證并上傳fileUri && this.fileUpload(fileUri, messageInfo, index)} else {// 2圖片處理const file = uriToSandBox(messageInfo.sourceFilePath);// 1)轉沙箱并壓縮const fileUri = await this.transferFile(messageInfo.sourceFilePath).catch(() => {loadingInstance.hide()});// 2)獲取上傳憑證并上傳fileUri && this.fileUpload(fileUri, messageInfo, index)}}

二、壓縮部分

實現思路:

圖片壓縮

packing二分方式循環壓縮

視頻壓縮

三種方案

代碼:

// 優先壓縮圖片質量
async qualityPriorityCompress(sourcePixelMap: image.PixelMap, maxCompressedImageSize: number) {let compressedImageData: ArrayBuffer =await this.packing(sourcePixelMap, IMAGE_QUALITY_ZERO, this.afterCompressFmt);// 先判斷圖片質量參數設置最低0能否滿足目標大小。如果能滿足目標大小,則直接使用packing二分圖片質量。如果不滿足,則質量參數固定為0,進行scale尺寸壓縮if (compressedImageData.byteLength <= maxCompressedImageSize * BYTE_CONVERSION) {// 滿足目標大小,直接使用packing二分await this.packingImage(sourcePixelMap, compressedImageData, maxCompressedImageSize * BYTE_CONVERSION);} else {// 不滿足目標大小,質量參數設置為0,再進行scale尺寸壓縮await this.scalePriorityCompress(sourcePixelMap, maxCompressedImageSize, IMAGE_QUALITY_ZERO);}// 更新顯示壓縮后的圖片格式this.showCompressFormat = this.afterCompressFmt;
}// packing二分方式循環壓縮
async packingImage(sourcePixelMap: image.PixelMap, compressedImageData: ArrayBuffer, maxCompressedImageByte: number) {let imageQuality: number = 0;const DICHOTOMY_ACCURACY = this.minBisectUnit;// 圖片質量參數范圍為0-100,這里以minBisectUnit為最小二分單位創建用于packing二分圖片質量參數的數組。const packingArray: number[] = [];// 性能知識點: 如果對圖片壓縮質量要求不高,建議調高minBisectUnit(對應‘packing最小二分單位’),減少循環,提升packing壓縮性能。for (let i = 0; i <= 100; i += DICHOTOMY_ACCURACY) {packingArray.push(i);}let left = 0; // 定義二分搜索范圍的左邊界let right = packingArray.length - 1; // 定義二分搜索范圍的右邊界const AFTER_COMPRESS_FMT = this.afterCompressFmt;// 二分壓縮圖片while (left <= right) {const mid = Math.floor((left + right) / 2); // 定義二分搜索范圍的中間位置imageQuality = packingArray[mid]; // 獲取二分中間位置的圖片質量值// 根據傳入的圖片質量參數進行packing壓縮,返回壓縮后的圖片文件流數據。compressedImageData = await this.packing(sourcePixelMap, imageQuality, AFTER_COMPRESS_FMT);// 判斷查找一個盡可能接近但不超過壓縮目標的壓縮大小if (compressedImageData.byteLength <= maxCompressedImageByte) {// 二分目標值在右半邊,繼續在更高的圖片質量參數(即mid + 1)中搜索left = mid + 1;// 判斷mid是否已經二分到最后,如果二分完了,退出if (mid === packingArray.length - 1) {break;}// 獲取下一次二分的圖片質量參數(mid+1)壓縮的圖片文件流數據compressedImageData = await this.packing(sourcePixelMap, packingArray[mid + 1], AFTER_COMPRESS_FMT);// 判斷用下一次圖片質量參數(mid+1)壓縮的圖片大小是否大于指定圖片的壓縮目標大小。如果大于,說明當前圖片質量參數(mid)壓縮出來的// 圖片大小最接近指定圖片的壓縮目標大小。傳入當前圖片質量參數mid,得到最終目標圖片壓縮數據。if (compressedImageData.byteLength > maxCompressedImageByte) {compressedImageData = await this.packing(sourcePixelMap, packingArray[mid], AFTER_COMPRESS_FMT);break;}} else {// 目標值不在當前范圍的右半部分,將搜索范圍的右邊界向左移動,以縮小搜索范圍并繼續在下一次迭代中查找左半部分。right = mid - 1;}}// ...
}

三、OSS上傳文件部分

方案圖:

?

?代碼:

鴻蒙環境服務端簽名直傳_對象存儲(OSS)-阿里云幫助中心

 // 獲取上傳憑證并上傳// index不是undefined時:修改private fileUpload = async (fileUrl: string, messageInfo: MessageInfo, index?: number) => {let fileInfo: fs.File | null = null;try {// 階段1:文件準備fileInfo = await fs.open(fileUrl, fs.OpenMode.READ_ONLY);const fileStat = await fs.stat(fileInfo.fd);const fileData = new ArrayBuffer(fileStat.size);await fs.read(fileInfo.fd, fileData);// 階段2:獲取上傳憑證(調接口1拿到file_name和upload_url)const fileType = this.videoFlag ? 'mp4' : 'jpg';const uploadInfo = await this.getUploadCredentials(fileType);// 階段3:執行文件上傳(向階段2拿到的upload_url上傳文件)await this.uploadFileToOSS(uploadInfo.upload_url, fileData, fileStat.size)// 階段4:更新列表數據 (將階段2獲取到的file_name更新進去,最后提交表單時傳參)this.updateMediaLists(uploadInfo.file_name, messageInfo, index);return true;} catch (error) {showToast('文件上傳失敗,請重新上傳')return false;} finally {// 確保資源釋放if (fileInfo?.fd) {await fs.close(fileInfo.fd);}loadingInstance.hide();}};

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

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

相關文章

河道流量監測,雷達流量計賦能水安全智慧守護

在蜿蜒的河道之上&#xff0c;水流的脈搏始終與人類文明的興衰緊密相連。從農田灌溉的水量調配到城市防洪的精準預警&#xff0c;從生態保護的水質溯源到水資源管理的決策&#xff0c;河道流量監測如同大地的 “血管檢測”&#xff0c;是守護水安全的第一道防線。傳統監測手段在…

CSS3 基礎(邊框效果)

一、邊框效果 屬性功能示例值說明border-radius創建圓角border-radius: 20px;設置元素的圓角半徑&#xff0c;支持像素&#xff08;px&#xff09;或百分比&#xff08;%&#xff09;。值為 50% 時可變為圓形。box-shadow添加陰影box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.5)…

零基礎小白如何上岸數模國獎

零基礎小白如何上岸數模國獎 我自己本人第一次參加數模國賽順利上岸國獎&#xff0c;當然那段經歷也是比較痛苦了&#xff0c;差不多也是從當年四月開始接觸數學建模&#xff0c;第一次參加媽媽杯成績并不理想&#xff0c;后面不斷參加數模比賽進行模擬&#xff0c;最后順利上岸…

SQL學習-常用函數

常見SQL函數使用 &#xff08;注意&#xff1a;不同的數據庫類型使用的語法不同&#xff09; 以下是MySQL和PostgreSQL在實現替換、抽取、拼接、分列四個常見字符串操作功能時的核心區別總結&#xff0c;按功能分類對比&#xff1a; 1. 替換&#xff08;Replace&#xff09; …

rt-linux下的cgroup cpu的死鎖bug

一、背景 rt-linux系統有其非常大的實時性的優勢&#xff0c;但是與之俱來的是該系統上有一些天然的缺陷。由于rt-linux系統允許進程在內核態執行的邏輯里&#xff0c;在持鎖期間&#xff0c;甚至持spinlock鎖期間&#xff0c;都能被其他進程搶占。這一特性能帶來實時性的好處…

java—12 kafka

目錄 一、消息隊列的優缺點 二、常用MQ 1. Kafka 2. RocketMQ 3. RabbitMQ 4. ActiveMQ 5. ZeroMQ 6. MQ選型對比 適用場景——從公司基礎建設力量角度出發 適用場景——從業務場景角度出發 四、基本概念和操作 1. kafka常用術語 2. kafka常用指令 3. 單播消息&a…

14【模塊學習】74HC595:使用學習

74HC595 1、74HC595簡介2、代碼演示2.1、驅動8位流水燈 3、74HC595級聯3.1、驅動16位流水燈3.2、驅動8位數碼管3.3、驅動8x8點陣屏幕3.4、8x8點陣屏幕滾動顯示 1、74HC595簡介 在51單片機中IO引腳資源十分的緊缺&#xff0c;所以常常需要使用75HC595芯片進行驅動那些需要占用多…

JAVA后端開發常用的LINUX命令總結

一、Linux常用命令大全&#xff08;2025年最新版&#xff09; 常用 Linux 命令 文件和目錄管理&#xff1a; cd&#xff1a;用于切換當前工作目錄&#xff0c;如cd /home/user。mkdir&#xff1a;創建新目錄&#xff0c;mkdir -p /home/user/mydir可遞歸創建多級目錄。pwd&am…

uniapp-商城-40-shop 購物車 選好了 進行訂單確認4 配送方式3 地址編輯

前面說了配送 和地址頁面 當地址頁面為空或需要添加地址時&#xff0c;需要添加地址。 我的地址頁面有個按鈕 就是添加地址 點擊 添加地址 按鈕 后&#xff0c;就會跳轉到地址添加的頁面 1、添加地址頁面 2、添加地址文件夾以及文件的創建 3、添加地址的代碼 <template…

現場問題排查-postgresql某表索引損壞導致指定數據無法更新影響卷宗材料上傳

問題現象 今天突然被拉進一個群&#xff0c;說某地區友商推送編目結果報錯&#xff0c;在我們自己的卷宗系統上傳材料也一直轉圈&#xff0c;也刪除不了案件卷宗&#xff0c;重置模板也沒用&#xff0c;只有個別案件有問題。雖然這事兒不屬于我負責&#xff0c;但還是抽時間給…

Redis01-基礎-入門

零、文章目錄 Redis01-基礎-入門 1、認識 NoSQL NoSQL 知識請參考&#xff1a;https://blog.csdn.net/liyou123456789/article/details/132612444 2、認識 Redis &#xff08;1&#xff09;簡介 Redis&#xff08;Remote Dictionary Server&#xff0c;遠程字典服務&…

【嘉立創EDA】如何在更新或轉換原理圖到PCB時,保留已有布局器件

文章路標?? :one: 文章解決問題:two: 主題內容:three: 參考方法be end..1?? 文章解決問題 操作環境:嘉立創EDA專業版 V2.2.37 本文使用嘉立創EDA,描述在更新或轉換原理圖到PCB時,保留已有布局器件的方法。本文將此過程記錄,以供有需要的讀者參考。 2?? 主題內容 …

03 APQC PROCESS CLASSIFICATION FRAMEWORK (PCF)

APQC流程分類框架&#xff08;APQC Process Classification Framework, PCF&#xff09;最初由美國生產力與質量中心&#xff08;American Productivity & Quality Center, APQC&#xff09;開發&#xff0c;旨在用于跨組織的流程性能基準比較。現在&#xff0c;它也常被用…

分析型數據庫入門指南:如何選擇適合你的實時分析工具?

一、什么是分析型數據庫&#xff1f;為什么需要它&#xff1f; 據Gartner最新報告顯示&#xff0c;超過75%的企業現已在關鍵業務部門部署了專門的分析型數據庫&#xff0c;這一比例還在持續增長。 隨著數據量呈指數級增長&#xff0c;傳統數據庫已無法滿足復雜分析場景的需求…

body Param Query 三個 不同的入參 分別是什么意思 在前端 要怎么傳 這三種不同的參數

在 NestJS 中&#xff0c;Body()、Param() 和 Query() 用于處理不同類型的請求參數。以下是它們的含義及前端傳遞方式&#xff1a; Body()&#xff1a;請求體參數 ? 含義&#xff1a;用于獲取請求體中的數據&#xff08;如 POST/PUT 請求中提交的 JSON、表單數據等&#xff09…

神經網絡(自己記錄)

一、神經網絡基礎 5分鐘-通俗易懂 - 神經網絡 反向傳播算法&#xff08;手算&#xff09;_嗶哩嗶哩_bilibili 二、GAT

Redis Slot 槽位分片具體案例

?鍵值槽位分配案例? 當執行 SET {kaigejava}k1 v1 時&#xff0c;Redis 會提取 {} 內的有效部分 kaigejava&#xff0c;通過 CRC16 算法計算哈希值&#xff0c;再對 16384 取余得到槽位。例如&#xff1a; 若計算結果為 1495&#xff0c;則該鍵會被分配到槽位 1495 對應的節…

【多模態模型】跨模態智能的核心技術與應用實踐

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現&#xff08;CLIP圖像-文本檢索&#xff09;運行結果驗證 三、性能對比測試方法論量化數據對比結果…

final static 中是什么final static聯合使用呢

final static 聯合使用詳解 final 和 static 在 Java 中經常一起使用&#xff0c;主要用來定義類級別的常量。這種組合具有兩者的特性&#xff1a; 基本用法 public class Constants {// 典型的 final static 常量定義public static final double PI 3.141592653589793;pub…

1.1 道路結構特征

1.1 道路結構特征 1.城市道路分類 道路網的地位、交通功能、沿線的服務功能。快速路 15 30主干路 15 30次干路 15 20支路 10 20 10(20)瀝青路面、水泥混凝土路面、砌塊路面瀝青路面:瀝青混凝土、瀝青貫入式、瀝青表面處治。瀝青混凝土各種等級、瀝青貫入式和瀝青表面處治支路…