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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…