大文件上传的解决办法~文件切片、秒传、限制文件并发请求。。。

server/2025/1/19 0:18:20/

1、项目背景:针对大文件上传,如果将文件作为一个请求去发送给后端,会有以下几种问题,首先是上传时间长,用户不能进行其他操作,包括页面刷新等操作,其次有的接口会设置响应时间限制,可能大文件还没上传完就触发响应限制了,这样对用户很不友好,那么怎么解决呢?

2、首先前端针对大文件使用文件切片技术,将大文件切成多个小文件,然后再将多个小文件传给后端,由后端进行组合即可。(文件切片)

<template><div><input type="file" @change="handleUpload" /></div>
</template><script setup>
import { ref } from 'vue';
const file = ref(null);
const chunk_size=1024*1024//每一个切片的大小(1M)
const chunks=ref([])//存储所有的切片
//文件上传函数
const handleUpload= async (e) => {const selectedFile = e.target.files[0]; // 拿到选择的文件的 files 文件数据if (!selectedFile ) return;file.value = selectedFile;fileName.value= selectedFile.name//存储文件名调用文件切片函数chunks.value = createFileChunk ()调用hash函数const hash = await calculateHash()fileHash.value=hash//存储文件hash
}
//文件切片函数
const createFileChunk = () => {let cur = 0//分片的下标let fileChunkList=[]//接收所有的分片//开始遍历文件while(cur < file.value.size){const blob = file.value.slice(cur,cur+chunk_size)//这里使用slice()方法进行剪切,值为开始下标和结束下标fileChunkList.push(blob)cur+=chunk_size//更新下标}return fileChunkList//向外抛出所有的切片
}</script>

3、依据文件内容生成唯一的hash值,可以避免文件改名后重复上传的问题。

这里,我们使用 spark-md5.min.js 来根据文件的二进制内容计算文件的 hash值。用来实现秒传

引入spark-md5.min.js
import SparkMD5 from 'spark-md5'
//计算文件hash值
const calculateHash = () => {return Promise(resolve=>{1、第一个和最后一个切片全部参与计算。2、中间的切片只计算前面2个字节、中间2个字节、最后2给字节。const targets:Blob=[]//存储所有参与计算的切片const spark=new SparkMD5.ArrayBuffer()const fileReader=new FileReader()chunks.value.forEach((chunk,index)=>{if(index===0 || index===chunks.length-1){1、第一个和最后一个切片全部参与计算。targets.push(chunk)} else{2、中间的切片只计算前面2个字节、中间2个字节、最后2给字节。targets.push(chunk.slice(0,2)//前面2个字节targets.push(chunk.slice(chunk_size/2,chunk_size/2+2)//中间2个字节targets.push(chunk.slice(chunk_size-2,chunk_size)//后面2个字节}})fileReader.readAsArrayBuffer(new Blob(targets))fileReader.onload=(e)=>{spark.append((e.target as FileReader).result)console.log('hash值',spark.end())resolve(spark.end())}})
}

4、前面我们完成了文件上传的准备工作,下面写文件上传:

const fileHash = ref('');
const fileName = ref('');const uploadChunks = async (chunks: Blob[]) => {const data = chunks.map((chunk, index) => {return {fileHash: fileHash.value, // 文件hashchunkHash: `${fileHash.value}-${index}`, // 文件切片hashchunk};});const formDatas = data.map(item => {const formData = new FormData();formData.append('chunk', item.chunk);formData.append('chunkHash', item.chunkHash);formData.append('fileHash', item.fileHash);return formData;});const max = 6; // 最大并发请求数let index = 0;const taskpool: Promise<Response>[] = []; // 请求池(当前正在处理的请求)while (index < formDatas.length || taskpool.length > 0) { // 代表文件未上传完或仍有请求在处理if (index < formDatas.length) {const task = fetch('upload', { method: 'POST', body: formDatas[index] }); // 发送请求taskpool.push(task); // 将新的请求(Promise)添加到 taskpool 中index++;}if (taskpool.length >= max) {const completedTask = await Promise.race(taskpool); // 等待 taskpool 中任意一个请求完成,然后继续循环taskpool.splice(taskpool.indexOf(completedTask), 1); // 将已完成的请求从任务池中移除}}await Promise.all(taskpool); // 确保所有请求都已完成
};


http://www.ppmy.cn/server/159485.html

相关文章

【机器学习:三十一、推荐系统:从基础到应用】

1. 推荐系统概述 推荐系统是一种根据用户的兴趣和偏好&#xff0c;为用户提供个性化建议的技术&#xff0c;广泛应用于电子商务、流媒体平台和社交媒体等领域。通过分析用户行为数据&#xff0c;推荐系统可以帮助用户发现他们感兴趣的内容&#xff0c;同时提升平台的用户体验和…

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1&#xff09;Anacanda使用CUDAPytorch2&#xff09;使用本地MNIST进行手写图片训练3&#xff09;…

vue的生命周期

生命周期是指一个对象、组件或应用程序从创建到销毁、从初始化到终止的整个过程。 Vue 2 生命周期钩子 beforeCreate实例初始化之后&#xff0c;数据观测和事件配置之前。created实例创建完成后&#xff0c;数据观测、属性和方法的运算、事件/回调配置之后。beforeMount挂载开…

试题转excel;word转excel;大风车excel(1.1更新)

更新了大风车excel1.1版本 主要优化在算法层面&#xff1a; 1.0版本试题解析的成功率为95%&#xff0c;现在1.1版本已经优化到解析成功率为99% 一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几…

【实践】操作系统智能助手OS Copilot新功能测评

一、引言 数字化加速发展&#xff0c;尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型&#xff0c;人工智能等&#xff0c;对操作系统的自然语言交互操作 推出很多功能&#xff0c;值得开发&#xff0c;尤其运…

论文阅读:SplatMAP: Online Dense Monocular SLAM with 3D Gaussian Splatting

1 Introduction 为了实现具有高保真渲染的实时三维重建&#xff0c;研究人员已经探索了将SLAM与可微渲染相结合的潜力。然而&#xff0c;单目SLAM系统&#xff0c;特别是在早期建图阶段&#xff0c;由于观测有限、三角测量基线较浅以及位姿约束较弱&#xff0c;容易产生不准确…

道旅科技借助云消息队列 Kafka 版加速旅游大数据创新发展

作者&#xff1a;寒空、横槊、娜米、公仪 道旅科技&#xff1a;科技驱动&#xff0c;引领全球旅游分销服务 道旅科技 &#xff08;https://www.didatravel.com/home&#xff09; 成立于 2012 年&#xff0c;总部位于中国深圳&#xff0c;是一家以科技驱动的全球酒店资源批发商…

linux、华为modelarts、昇腾服务器、docker中,服务进程还在,但是不在运行状态,没有响应

如果代码没问题&#xff0c;就继续往下看 使用python代码和shell脚本&#xff0c;都会出现这个问题 查看进程 ps aux | grep 你的python程序或shell脚本 发现进程还是正常的可以看到&#xff0c;状态也很正常 解决思路 如果你的启动方法&#xff0c;是类似 python app.py …