vue實現小程序oss分片上傳

隨著小程序越來越普及,小程序上傳文件必不可少,那么上傳的文件大小就不可控了,小則幾mb,大到好幾百mb,小文件還可以,但是一到超過200mb或稍微再大些的小程序就很容易上傳失敗,導致功能不能繼續進行。以下我們就來解決這個問題,將大文件實現分片上傳

溫馨提示,不要看內容多,其實很好理解,實在看起來頭疼的,就運行起代碼來,逐行打印就明白了,希望能幫到你。代碼在最后,加油!!!

這是一份在前端(uni-app/小程序)直接對接阿里云 OSS 的“分片上傳”實現,采用新版簽名算法 OSS4-HMAC-SHA256(俗稱 SigV4)。

v4簽名官方算法地址:在Header中包含V4簽名(推薦)_對象存儲(OSS)-阿里云幫助中心

服務端獲取sts訪問憑證官方文檔地址:使用STS臨時訪問憑證訪問OSS_對象存儲(OSS)-阿里云幫助中心

開發準備:安裝依賴:npm install crypto-js

流程是:

  • 取 STS 臨時憑證;
  • 先發起初始化分片(Init)拿到 UploadId;
  • 并發讀取本地文件片段,逐片 PUT;
  • 最后 POST 完成分片(Complete),把各分片的 ETag 上報,生成最終對象。

關鍵概念與規范

  • CanonicalRequest:參與簽名的“規范化請求字符串”,由 6 行組成:Method、CanonicalURI、CanonicalQueryString、CanonicalHeaders、AdditionalHeaders、PayloadHash。
  • StringToSign:把 CanonicalRequest 做 SHA256,再與算法名、時間、credentialScope 拼成最終待簽名字符串。
  • Authorization:用派生出來的簽名密鑰對 StringToSign 做 HMAC-SHA256,形成簽名后,連同訪問鍵與 AdditionalHeaders 一起寫入該頭。
  • UNSIGNED-PAYLOAD:上傳流式/分片時,不對包體求哈希,x-oss-content-sha256 與 PayloadHash 都寫 UNSIGNED-PAYLOAD,以避免前端為大包體計算 sha256 的高開銷。
  • 對象元數據 Content-Type 的確定時機:在“初始化分片”時確定,也就是你代碼里把 content-type 設為真實文件類型的原因;后續 PUT/Complete 不會改變它。

代碼分層與每段意義

  • 工具層
  • toHex、hmacSHA256、sha256HexOfString、sha256HexOfArrayBuffer:簽名/哈希基礎封裝,arrayBufferToWordArray 用來把 ArrayBuffer 轉成 crypto-js 可用的 WordArray。
  • utf8ToArrayBuffer:把 XML 等字符串轉為 ArrayBuffer。
  • encodeRFC3986/encodePath:路徑/參數嚴格 RFC3986 編碼(OSS4 要求)。
  • buildCanonicalQuery:把查詢參數字典規整為“按 key 排序”的 query 串;特別注意空值參數需寫成 ?uploads(無等號)。
  • toLowerKeys/trimAndJoinHeaders/signedHeadersListExcluding:規整請求頭(小寫、去多空格、按 key 排序);AdditionalHeaders 是“參與簽名的頭名列表”,此實現特意把 content-type 排除在列表外,但它仍出現在 CanonicalHeaders 內。
  • 簽名層
  • getSigningKey:按阿里規范派生簽名密鑰:aliyun_v4 + secret → kDate → kRegion → kService(oss) → kSigning('aliyun_v4_request')。
  • buildAuthorization:構建 CanonicalRequest、StringToSign、Authorization 字符串,返回三者用于調試/發送。
  • 時間
  • nowToDateTimeZ:產生 UTC 格式 YYYYMMDDTHHMMSSZ,作為 x-oss-date 與簽名時間。時間漂移過大服務器會拒絕。
  • 本地文件讀與 HTTP
  • statFile/readFileSlice:小程序文件系統讀文件、按偏移讀取分片。
  • requestBuffer:uni.request 的薄封裝。
  • asyncPool:并發池,限制同一時間的分片上傳并發數。
  • XML 輔助
  • parseXmlTag:解析 OSS 返回的 XML 指定標簽。
  • buildCompleteXML:按 PartNumber 升序拼出 CompleteMultipartUpload XML。
  • guessContentType:按后綴猜測 Content-Type,用于 Init 請求,確保最終對象是正確媒體類型(mp4/mov/mp3 等)。

主流程 multipartUpload(opts)

   入參:filePath、objectKey、partSizeMB、maxConcurrency、onProgress、fetchSts。
  • 校驗入參,statFile 獲取總大小。
  • await fetchSts() 獲取 STS(AK、SK、Token、bucket、region 等)。
  • 計算域名與地區:
  •     endpointRegion:形如 oss-cn-beijing
  •     signingRegion:形如 cn-beijing
  • 重要的 URI 分離:
  •     canonicalUriForSign = /${bucket}/${encodePath(objectKey)}(僅用于簽名)
  •     canonicalUriForReq = /${encodePath(objectKey)}(真實請求路徑)
  • 計算對象 MIME:objectContentType = guessContentType(objectKey)。
1) 初始化分片(POST ?uploads)
  • 頭:host、x-oss-date、x-oss-security-token、x-oss-content-sha256: UNSIGNED-PAYLOAD、content-type: 對象真實類型。
  • 簽名時用 canonicalUriForSign;請求 URL 用 canonicalUriForReq。
  • 解析響應的 UploadId。
2) 計算分片列表
  • partSize = max(100KB, partSizeMB);生成 partNumbers = [1..N]。
3) 上傳每個分片(PUT ?partNumber=&uploadId= 并發)
  • 本地 readFileSlice 讀 ArrayBuffer。
  • 頭:content-type: application/octet-stream、x-oss-content-sha256: UNSIGNED-PAYLOAD 等。
  • 成功讀取響應頭 ETag,保存 [{PartNumber, ETag}]。
  • 進度回調 onProgress(loaded, total)。
4) 完成分片(POST ?uploadId=)
  • Body:CompleteMultipartUpload XML(ArrayBuffer)。

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

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

相關文章

14.Shell腳本修煉手冊--玩轉循環結構(While 與 Until 的應用技巧與案例)

while 循環和 until 循環的應用實踐 文章目錄while 循環和 until 循環的應用實踐當型和直到型循環:兩種 "重復" 的邏輯while 循環:滿足條件就繼續until 循環:不滿足條件就繼續基礎示例:從簡單場景學用法示例 1&#xff…

chromadb使用hugging face模型時利用鏡像網站下載注意事項

chromadb默認使用sentence-transformers/all-MiniLM-L6-v2的詞嵌入(詞向量)模型,如果在程序首次運行時,collection的add或query操作時如果沒有指定embeddings或query_embeddings,程序會自動下載相關嵌入向量模型&#…

基于大模型的對話式推薦系統技術架構設計

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》(跟我一起學人工智能)【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

第1章 React組件開發基礎

在掌握React開發之前,我們需要先建立扎實的組件開發基礎。這些基礎知識不僅影響你的開發效率,更決定了應用程序的性能、可維護性和團隊協作的順暢程度。 本章將深入探討React組件開發的核心技巧,從JSX語法優化到組件架構設計,幫你建立正確的React開發思維模式。 ??? 本…

【yocto】Yocto Project 配置層(.conf)文件語法詳解

【加關注,不迷路,持續輸出中...】Yocto Project 是一個開源的嵌入式 Linux 系統構建框架,其核心是通過元數據(Metadata)來定義如何構建系統。這些元數據主要包括配方(.bb / .bbappend)、配置&am…

知識蒸餾 Knowledge Distillation 序列的聯合概率 分解成 基于歷史的條件概率的連乘序列

知識蒸餾 Knowledge Distillation 序列的聯合概率 分解成 基于歷史的條件概率的連乘序列 flyfish 代碼實踐 論文 Generalized Knowledge Distillation (GKD) On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes 自回歸分解 將 “序列的聯合…

React15.x版本 子組件調用父組件的方法,從props中拿的,這個方法里面有個setState,結果調用報錯

在React 15.x中,子組件通過props調用父組件包含setState的方法時出現錯誤,最常見的原因是父組件方法的this指向丟失,導致調用setState時出現Cannot read property setState of undefined之類的錯誤。 核心原因 React類組件的方法默認不會綁定…

交叉編譯.so到鴻蒙使用

以下是在 Ubuntu 20.04 系統上的操作,tpc_c_cplusplus 他是把編譯的流程都給寫進去了,你只需要關注你要編譯的庫配置好環境就行了。 第一步:下載 tpc_c_cplusplus 倉庫地址: GitCode - 全球開發者的開源社區,開源代碼托管平臺…

LLaMA-Factory 中配置文件或命令行里各個參數的含義

常見參數分類 & 含義對照表: 🔹模型相關參數含義model_name_or_path基礎模型的路徑(本地或 HuggingFace Hub 上的名字,如 meta-llama/Llama-2-7b-hf)adapter_name_or_pathLoRA/Adapter 權重路徑(如果要…

JavaScript 性能優化實戰技術文章大綱

一、引言1.1 背景闡述在當今 Web 應用高度交互化、復雜化的趨勢下,JavaScript 作為核心腳本語言,其性能優劣直接決定了用戶體驗的好壞。從單頁應用(SPA)的流暢運行,到復雜數據可視化的實時交互,JavaScript …

正點原子【第四期】Linux之驅動開發學習筆記-2.1LED燈驅動實驗(直接操作寄存器)

前言: 本文是根據嗶哩嗶哩網站上“正點原子【第四期】手把手教你學Linux系列課程之 Linux驅動開發篇”視頻的學習筆記,該課程配套開發板為正點原子alpha/mini Linux開發板。在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內…

【GM3568JHF】FPGA+ARM異構開發板 測試命令

本章節的命令操作均在板卡的終端執行 1 初探/sys目錄 與/proc目錄類似,/sys目錄下的文件/文件夾向用戶提供了一些關于設備、內核模塊、文件系統以及其他內核組件的信息, 如子目錄block中存放了所有的塊設備;子目錄bus中存放了系統中所有的總…

【Win】Motrix+Aria2瀏覽器下載加速

系統安裝Motrix Motrix官網下載,推薦下載NSIS Installer 安裝版 瀏覽器安裝Aria2 下載Aria2插件,然后開發者模式安裝到瀏覽器 Aria2擴展選項的配置如下: 端口號需要改成Motrix的,默認是16800

SpringBoot applicationContext.getBeansOfType獲取某一接口所有實現類,應用于策略模式

本文介紹了如何在Springboot項目中通過ApplicationContext獲取接口的實現類,并通過枚舉策略模式避免if/else,展示了如何使用getBeansOfType獲取TrafficModeService的實現,以及如何在實際場景中應用,如查詢交通方式費用 1 在實際工…

大模型問題:幻覺分類+原因+各個訓練階段產生幻覺+幻覺的檢測和評估基準

1. 什么是幻覺?大模型出現幻覺,簡而言之就是“胡說八道”。 用《A Survey on Hallucination in Large Language Models》1文中的話來講,是指模型生成的內容與現實世界事實或用戶輸入不一致的現象。 研究人員將大模型的幻覺分為事實性幻覺&…

智慧冷庫物聯網解決方案——實現降本增效與風險可控的冷庫管理新范式

一、冷庫管理痛點設備孤島化:冷庫品牌、型號分散,缺乏統一接入標準,數據互通難,依賴人工巡檢,故障響應滯后。能耗黑洞:制冷系統能耗占冷庫總運營成本的60%以上,傳統管理粗放,缺乏動態…

太空生活的八種要素

數代以來,科學家們一直在銀河系中搜尋地外行星存在生命的證據。他們試圖找到一組特定的環境條件與化學物質,在恰當的時間、恰當的地點交匯融合。 通過研究人類、植物、動物及微生物在地球上的生存與繁衍方式,科學家們已識別出生命演化所需的關…

Flutter 小技巧之有趣的 UI 骨架屏框架 skeletonizer

很久沒有更新過小技巧系列,今天簡單介紹一個非常好用的骨架屏框架 skeletonizer ,它主要是通過將你現有的布局自動簡化為簡單的骨架,并添加動畫效果來實現加載過程,而使用成本則是簡單的添加一個 Skeletonizer 作為 parent &…

基于SpringBoot的寵物用品系統【2026最新】

作者:計算機學姐 開發技術:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源碼”。 專欄推薦:前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄:…

MongoDB 分片集群修改管理員密碼

記得關注一下博主,博主每天都會更新IT技術,讓你有意想不到的小收獲哦^_^ 文章目錄*記得關注一下博主,博主每天都會更新IT技術,讓你有意想不到的小收獲哦^_^*一、注釋MongoDB分片集群認證參數(三臺主機都要操作&#xf…