前端大文件上传 -- 上传文件到S3或本地服务器

news2024/11/26 17:27:52

特别提醒

大文件上传的文件切片逻辑, 包括如何将分片文件上传到本地服务器, 请查看之前的文章: 前端大文件上传 - 总结(Vue3 + hook + Web Worker实现,通过多个Worker线程大大提高Hash计算的速度), 本篇仅实现如何将大文件分块上传到S3.
后面写一篇文章实现选中多个文件,显示上传列表可取消上传,以及整合这两篇文件到一篇里,因为涉及的逻辑比较多

流程图

请添加图片描述

实现逻辑

上节的代码实现中的 uploadFile 函数,我们只需要在对应的代码中添加 加粗样式就行

// 例如下面
async function uploadFile() {
	const data = await checkFile()
	if (!data) return

	const { chunk_upload, upload_id } = data
	uploadId.value = upload_id

	if (chunk_upload.length === 0) {
		// 上传整个文件
		// 上传到S3
		if (isS3) return await handleUploadS3Request()
	}
	
	if (chunk_upload.length !== chunkTotal.value) {
		// 上传未上传的分片 - 断点续传
		if (isS3) return await handleUploadS3Request(chunk_upload)
	}

	// 无论是上传到S3还是本地服务器可能存在合并失败的问题
	// 这里应该处理未合并的情况,值需要发送合并请求
	code...
	
	// 上传完成 - 秒传(可能需要发起合并请求)
	code...
}
handleUploadS3Request函数

提醒: 获取ETag需要配置对应的桶策略,ExposeHeaders数组里配置ETag

// 记录上传到S3的分块
	const s3UploadedChunks = ref([])

// 上传到S3
	async function handleUploadS3Request(uploadedChunks = []) {
		s3UploadedChunks.value = JSON.parse(JSON.stringify(uploadedChunks))

		for (let i = 0; i < fileChunkList.value.length; i++) {
			if (uploadedChunks.indexOf(i + 1) === -1) {
				// 申请上传S3的url
				const { code, data, msg } = await applyS3UrlFn({
					part_no: i + 1,
					upload_id: uploadId.value,
				})

				if (code === 0) {
					try {
						await uploadS3Chunk(data.signed_url, i)
					} catch (error) {
						// 上传失败
						...
						return false
					}
				} else {
					// 申请失败
					...
					return false
				}
			}
		}
	}

	// 上传S3文件某个分块
	async function uploadS3Chunk(url, i) {
		const etag = await createXhr(url, i)

		// 记录已上传的分块
		s3UploadedChunks.value.push(i + 1)
		// 上传S3文件某个分块完成
		await s3ChunkDoneFn({
			part_no: i + 1,
			upload_id: uploadId.value,
			etag,
		})

		if (s3UploadedChunks.value.length === chunkTotal.value) {
			// 上传S3文件所有分块完成
			await s3AllChunkDoneFn({ upload_id: uploadId.value })
			// 上传成功
			callback && callback()
		}
	}

	let xhr = null
	// 使用XMLHttpRequest上传Chunk
	async function createXhr(url, i) {
		return new Promise((resolve, reject) => {
			xhr = new XMLHttpRequest()
			xhr.open('PUT', url)

			xhr.upload.onprogress = (e) => {
				getFileProgress(e, i)
			}

			xhr.onload = () => {
				if (xhr.status === 200) {
					// 返回ETag
					resolve(xhr.getResponseHeader('ETag'))
				} else {
					reject(new Error('File upload failed'))
				}
			}

			xhr.onerror = () => {
				reject(new Error('File upload failed'))
			}

			xhr.onabort = () => {
				cancelFn({ upload_id: uploadId.value })
				reject(new Error('File upload aborted'))
			}

			xhr.send(fileChunkList.value[i])
		})
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1599957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Yolo-world使用

1、安装 python pip install ultralytics 前往官网下载模型&#xff1a;https://docs.ultralytics.com/models/yolo-world/#key-features 我这里使用yolov8s-world.pt举例 最简单的使用示例 if __name__ __main__:model YOLO(model/yolov8s-world.pt)results model.pre…

力扣101. 对称二叉树(java)

思路&#xff1a; 一、验证 左右子树是否可翻转对称的&#xff1f; 二、分析左右子树情况&#xff1a; 1&#xff09;左右都也空 对称 2&#xff09;左右有一个为空 不对称 3&#xff09;左右都不为空&#xff0c;但数字不同 不对称 4&#xff09;左右都不为空&#xff0c;且数…

ENVI实战—一文学会使用GLT配准工具对风云数据进行几何校正

实验2&#xff1a;学会使用GLT配准工具 目的&#xff1a;完成气象卫星数据的校正&#xff0c;掌握利用GLT配准工具实验地理配准的方法 过程&#xff1a; ①读取影像&#xff1a;选择“文件”&#xff0c;选择“HS5”文件并打开&#xff0c;在弹出的科学数据集浏览器中&#x…

保姆级教程 | Adobe Illustrator 中插入数学符号

背景 鉴于Adobe Illustrator作为比较专业的绘图/组图软件&#xff0c;我的论文数据作图都会选择先在origin中把原始数据绘制好&#xff0c;后都放入AI中细修。由于在作图过程中需要插入数学符号&#xff0c;但仿佛没有PowerPoint用起来那么熟悉&#xff0c;遂记录下。 步骤 …

高分二号卫星(GF-2):中国遥感科技的新高度

​高分二号卫星&#xff08;GF-2&#xff09;是中国在高分辨率地球观测领域的重要成就&#xff0c;其引入了先进的成像技术和灵活的数据获取模式&#xff0c;为地球资源监测、环境保护、城市规划等领域提供了强大的数据支持。本文将深入介绍高分二号卫星的技术特点、成像能力以…

Methoxy PEG Tosylate可以用于制备特定化合物、改变分子的溶解性和生物活性

【试剂详情】 英文名称 mPEG-OTs,mPEG-Tosylate, Methoxy PEG Tosylate 中文名称 聚乙二醇单甲醚对甲苯磺酸酯&#xff0c; 甲氧基聚乙二醇甲苯磺酸酯 外观性状 取决于分子量&#xff0c;粘稠液体或固体 分子量 400&#xff0c;600&#xff0c;2k&#xff0c;3.4k&#…

JavaWeb前端/后端开发规范——接口文档概述及YApi平台的使用

前言&#xff1a; 整理下笔记&#xff0c;打好基础&#xff0c;daydayup!!! 接口文档 什么是接口文档&#xff1f; 目前主流的开发模式为前后端分离式开发&#xff0c;为了方便前后端的对接&#xff0c;就需要使用接口文件进行统一规范。 接口文档记载什么信息&#xff1f; 1&…

【C/C++笔试练习】read函数、虚拟存储、用户态、线程特点、缺页处理、调度算法、进程优先级、锁的使用、创建进程、不用加减乘除做加法、三角形

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;read函数&#xff08;2&#xff09;虚拟存储&#xff08;3&#xff09;用户态&#xff08;4&#xff09;线程特点&#xff08;5&#xff09;缺页处理&#xff08;6&#xff09;调度算法&#xff08;7&#xff09;进程优先…

动态IP代理API的应用与优点

“动态”意味着每次连接或每隔一段时间&#xff0c;用户的IP地址都会发生改变。由于IP地址的不断变化&#xff0c;用户可以避免因频繁访问同一网站而导致的IP被封锁的问题。API叫做应用程序接口&#xff0c;是一种让软件之间相互通信的接口。API允许用户通过编程方式来调用动态…

vs2019 - detected memory leak

文章目录 vs2019 - detected memory leak概述笔记vs2019 consolevs2019 MFC Dlg但是&#xff0c;工程大了之后&#xff0c;VS2019提示的就变了样整好的内存泄漏侦测头文件和实现my_debug_new_define.hmy_debug_new_define.cpp在所有.cpp文件入口处包含my_debug_new_define.h包含…

深度学习 Lecture 8 决策树

一、决策树模型&#xff08;Decision Tree Model) 椭圆形代表决策节点&#xff08;decison nodes)&#xff0c;矩形节点代表叶节点&#xff08;leaf nodes)&#xff0c;方向上的值代表属性的值&#xff0c; 构建决策树的学习过程&#xff1a; 第一步&#xff1a;决定在根节点…

【切换网络连接后】VMware虚拟机网络配置【局域网通信】

初次安装Linux虚拟机以及切换网络都需要配置虚拟机网络&#xff0c; 从而使得win主机内通过远程连接工具能够连接该虚拟机&#xff0c; 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作&#xff0c;以及局域网通信的一些基础知识。 …

一文看懂CRMEB开源商城系统与标准版之间的区别

一直以来&#xff0c;CRMEB开源商城系统和标准版商城系统都在被比较&#xff0c;很多人都会疑问&#xff0c;为什么有免费的开源商城系统&#xff0c;还有那么多人去购买商业版的CRMEB标准版商城系统呢&#xff1f;其实&#xff0c;在纠结到底选哪款系统时&#xff0c;我们不妨…

重磅消息:CnosDB 文档网站升级全新框架啦!

我们很高兴地宣布&#xff0c;CnosDB 文档网站迎来了一次重大升级&#xff01;现在&#xff0c;我们采用了全新的强大的开源文档框架&#xff0c;为用户提供更流畅、更直观的浏览体验。 全新框架带来的优势&#xff1a; 更快速的加载速度&#xff1a;现在您可以更快地访问并查…

运输问题的中转或者转运问题

1、这类问题&#xff0c;不好理解&#xff0c;做个笔记&#xff0c;记录一下。 2、可以参考一下&#xff1a; https://blog.csdn.net/YUNCHOUSHUO/article/details/121660675?spm1001.2014.3001.5506 这个csdn写的还是不错的&#xff0c;推荐。 或者&#xff0c;可以参考 …

飞腾UEFI电源控制选择代码解析

飞腾UEFI电源控制选择代码解析 CPLD 处理方式EC 处理方式注:本文以飞腾UEFI edk-code-4.2.0版本进行说明,如果有朋友需要借鉴,请使用该版本代码。 以D2000打工工具为例,下图打包工具中有选择主板电源管理方式,这里可以选择CPLD、EC、和SE,其中SE代表为X100控制上下电时序…

2024年面试工具篇Postman面试题及答案

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

市场复盘总结 20240416

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 50% 最常用的二…

面试:sleep 和 wait

一、共同点 wait(),wait(long)和sleep(long)的效果都是让当前线程暂时放弃CPU的使用权&#xff0c;进入阻塞状态 二、不同点 1、方法归属不同 sleep(long)是Thread的静态方法而wait(), wait(long)都是Object的成员方法&#xff0c;每个对象都有 2、醒来的时机不同 执行sleep(l…

whatsapp 语音通话 音频编码(五)

Whatsapp VoiceCall 客户端通过websocket连接到服务器&#xff0c;客户端发起语音通话请求&#xff0c;并且完成必要的协商之后&#xff0c;就可以直接将语音数据发送给服务器&#xff0c;服务器接收到对方的语音数据之后也会通过websocket将语音数据转发给客户端 获取协商秘…