js 大文件切片,中止上传,上传进度,断点续传

大文件切片上传

背景介绍:当涉及大文件上传时,一种有效的方法是将大文件分割成小切片并逐个上传。这种技术不仅可以减轻服务器的负担,还可以避免上传过程中的中断和内存问题。本文将介绍如何使用JavaScript实现大文件切片上传,并解释如何处理断点续传、并发控制以及上传取消等问题,用到的知识点有大文件切片、中止上传 、上传进度、断点续传、并发数量控制。

切片上传原理

大文件切片上传的基本原理是将文件分成多个固定大小的小切片,然后逐个上传到服务器。服务器收到这些切片后,可以按顺序合并它们,还原为完整的文件。这种方法不仅能提高上传效率,还能应对网络波动和服务器性能限制。

实现步骤

下面是实现大文件切片上传的基本步骤:

切片生成: 使用JavaScript将大文件切割成小切片,可以使用File API中的File.slice()方法。

切片上传: 将切片逐个上传到服务器,可以使用XMLHttpRequest或Fetch API发送切片数据。

服务器处理: 服务器接收并保存切片,并记录每个切片的索引。

切片合并: 当所有切片上传完成后,服务器按照索引顺序合并切片(或者后端提供合并接口将hash值传给后端进行合并),还原为完整文件。

断点续传

通过记录已上传切片的索引,即使上传过程中断,也可以从断点处继续上传。服务器只需判断已存在的切片,避免重新上传。

并发控制

为了避免同时上传大量切片导致网络拥塞,可以控制并发上传数。例如,一次最多只上传3个切片,等待其中一个完成后再上传下一个。

上传取消

允许用户在上传过程中取消操作是很重要的。为此,可以使用一个标记来判断是否取消上传,如果取消,则终止上传过程。

接下来,我们将深入探讨如何在JavaScript中实现这些功能。从切片生成和上传开始,逐步讲解如何处理断点续传、并发控制和上传取消。

话不多说,上代码

<template><div class="manage"><input type="file" @change="handleFileChange" multiple /><button @click="stop">停止上传</button><span>当前已上传:{{progress}}%</span></div>
</template><script>
export default {name: 'Menu',props: {},mounted () {},data () {return {progress: 0,stopUpload: false,totalChunks: null,selectedFiles: [],uploadPromises: [],concurrentLimit: 2 // 控制并发数量}},methods: {handleFileChange (event) {this.selectedFiles = Array.from(event.target.files)this.startUpload(event.target.files)},async uploadFile (file, index, total) {return new Promise((resolve, reject) => {// 模拟上传操作,实际上传操作可能需要使用 XMLHttpRequest 或其他上传库// setTimeout(async () => {//   console.log(`Uploaded: ${file.name}`)//   const formData = new FormData();//   formData.append('fileChunk', file);//   formData.append('chunkIndex', index);//   formData.append('totalChunks', total);//   const response = await fetch('upload-url', {//     method: 'POST',//     body: formData//   });//   const result = await response.json();//   resolve(result)// }, 1000) // 假设上传耗时 1 秒setTimeout(async () => {console.log(`Uploaded: ${file.name}`)resolve()}, 2000) // 假设上传耗时 1 秒})},async startUpload (file) {console.log('file', file)this.uploadPromises = []const size = 1024 * 1024const formNum = Math.ceil(file[0].size / size)const hashes = []for (let i = 0; i <= formNum; i++) {const start = size * i;const end = size * (i + 1)const chunk = file[0].slice(start, end);const hash = await this.calculateHash(chunk);console.log('this.stopUpload', this.stopUpload)if (this.stopUpload) return falsehashes.push(hash)// 将需要上传的切片和对应的哈希值添加到FormData中// 断点续传逻辑需要后端判断,前端根据片段生成唯一hash值,后端存储hash,续传时候需要判断若已上传直接给出进度const promise = this.uploadFile(chunk, i, formNum)this.uploadPromises.push(promise)if (this.uploadPromises.length >= this.concurrentLimit) {await Promise.race(this.uploadPromises) // 控制并发this.uploadPromises.shift() // 移除已完成的 Promise}this.progress = (i / formNum) * 100}console.log('hashes', hashes)await Promise.all(this.uploadPromises) // 等待剩余的上传完成console.log('全部完成上传!')// 调用后端提供合并接口// const response = await fetch('upload-merge', {//   method: 'POST',//   body: hashes// })},async calculateHash (chunk) {const buffer = await chunk.arrayBuffer()const hashBuffer = await crypto.subtle.digest('SHA-256', buffer)const hashArray = Array.from(new Uint8Array(hashBuffer))const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('')return hashHex},stop () {this.stopUpload = true}}
}
</script>

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

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

相关文章

Mac下全选,使用pynput,怎样调用command键?

Key.command 不行&#xff0c;用Key.cmd 。 win或linux下&#xff1a; with keyboard.pressed(Key.ctrl):keyboard.press(a)time.sleep(1)keyboard.release(a) 那么在mac下就是&#xff1a; with keyboard.pressed(Key.cmd):keyboard.press(a)time.sleep(1)keyboard.rel…

模拟信号和数字信号的转换

此文章介绍的模拟信号与数字信号转换相关的知识有如下&#xff1a; 通信原理的PCM脉冲编码调制 数字电子技术的A/D与D/A 以及stm32的ADC与DAC 模拟信号是指-----时间和数值均连续变化的电信号&#xff0c;如正弦波、三角波等。 数字信号是指-----在时间上和数值上均是离散的…

deeplabv2模型分割草地

from engine import coco_infer, DeeplabModel import cv2 import os import numpy as np from pathlib import Path test_folder rD:\Research\test/year result_folder rD:\Research\result/year# 从test文件夹中获取文件名 test_filenames os.listdir(test_folder)# 如果…

数据结构【图的类型定义和存储结构】

数据结构之图 图的定义和概念图的定义图的术语 图的类型定义图的存储结构数组&#xff08;邻接矩阵&#xff09;表示法无向图的邻接矩阵表示法有向图的邻接矩阵表示法网&#xff08;即有权图&#xff09;的邻接矩阵表示法 邻接矩阵的ADT定义邻接表&#xff08;链式&#xff09;…

leetcode面试题:动物收容所(考查对队列的理解和运用)

题目&#xff1a; 有家动物收容所只收容狗与猫&#xff0c;且严格遵守“先进先出”的原则。在收养该收容所的动物时&#xff0c;收养人只能收养所有动物中“最老”&#xff08;由其进入收容所的时间长短而定&#xff09;的动物&#xff0c;或者可以挑选猫或狗&#xff08;同时…

聊一下互联网开源变现

(点击即可收听) 互联网开源变现其实是指通过开源软件或者开放源代码的方式&#xff0c;实现收益或盈利。这种方式越来越被广泛应用于互联网行业 在互联网开源变现的模式中&#xff0c;最常见的方式是通过捐款、广告、付费支持或者授权等方式获利。 例如&#xff0c;有些开源软件…

数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 假设数组非空&#xff0c;并且一定存在满足条件的数字。 思考题&#xff1a; 假设要求只能使用 O(n) 的时间和额外 O(1) 的空间&#xff0c;该怎么做呢&#xff1f; 数据范围 数组长度 [1,10…

内网穿透实战应用-——【如何在树莓派上安装cpolar内网穿透】

如何在树莓派上安装cpolar内网穿透 文章目录 如何在树莓派上安装cpolar内网穿透前言1.在树莓派上安装cpolar2.查询cpolar版本号3.激活本地cpolar客户端4.cpolar记入配置文件 前言 树莓派作为一个超小型的电脑系统&#xff0c;虽然因其自身性能所限&#xff0c;无法如台式机或笔…

【金融量化】Python实现根据收益率计算累计收益率并可视化

1 理论 理财产品&#xff08;本金100元&#xff09; 第1天&#xff1a;3% &#xff1a;&#xff08;13%&#xff09; ✖ 100 103 第2天&#xff1a;2% &#xff1a;&#xff08;12%&#xff09;✖ 以上 103 2.06 第3天&#xff1a;5% : &#xff08;15%&#xff09;✖ 以上…

游戏行业实战案例 5 :玩家在线分布

【面试题】某游戏数据后台设有“登录日志”和“登出日志”两张表。 「登录日志」记录各玩家的登录时间和登录时的角色等级。 「登出日志」记录各玩家的登出时间和登出时的角色等级。 其中&#xff0c;「角色 id 」字段唯一识别玩家。 游戏开服前两天&#xff08; 2022-08-13 至…

mfc 编辑框限制

DoDataExchange由框架调用&#xff0c;作用是交互并且验证对话框数据&#xff0c;主要由(DDX) 和 (DDV)宏实现。 永远不要直接调用这个函数&#xff0c;而是通过UpdateData(TRUE/FALSE)实现控件与变量之间值的传递。 当然你也可以不使用DoDataExchange而完成控件与变量之间值…

Python-组合数据类型

今天要介绍的是Python的组合数据类型 整理不易&#xff0c;希望得到大家的支持&#xff0c;欢迎各位读者评论点赞收藏 感谢&#xff01; 目录 知识点知识导图1、组合数据类型的基本概念1.1 组合数据类型1.2 集合类型概述1.3 序列类型概述1.4 映射类型概述 2、列表类型2.1 列表的…

java下载JDK

1.去官网下载 https://www.oracle.com/java/technologies/javase-downloads.html 2.点击 傻瓜式安装 注意选择版本跟电脑系统就行 下载后文件的作用

32个关于FPGA的学习网站

语言类学习网站 1、HDLbits 网站地址&#xff1a;https://hdlbits.01xz.net/wiki/Main_Page 在线作答、编译的学习Verilog的网站&#xff0c;题目很多&#xff0c;内容丰富。非常适合Verilog初学者&#xff01;&#xff01;&#xff01; 2、牛客网 网站地址&#xff1a;https:…

Flink CDC系列之:TiDB CDC 导入 Elasticsearch

Flink CDC系列之&#xff1a;TiDB CDC 导入 Elasticsearch 一、通过docker 来启动 TiDB 集群二、下载 Flink 和所需要的依赖包三、在TiDB数据库中创建表和准备数据四、启动Flink 集群&#xff0c;再启动 SQL CLI五、在 Flink SQL CLI 中使用 Flink DDL 创建表六、Kibana查看Ela…

不知道打仗之害,就不知道打仗之利

不知道打仗之害&#xff0c;就不知道打仗之利 【安志强趣讲《孙子兵法》第7讲】 【原文】 夫钝兵挫锐&#xff0c;屈力殚货&#xff0c;则诸侯乘其弊而起&#xff0c;虽有智者&#xff0c;不能善其后矣。 【注释】 屈力殚货&#xff1a;屈力&#xff0c;指力量消耗&#xff0c;…

工业巡检ar沉浸式互动培训体验实现更加直观、生动的流程展示

以往的工业手工巡检效率极低&#xff0c;错误率偏高&#xff0c;漏检问题严重&#xff0c;会因为现场人员对机械设备的早期维护、操作不会&#xff0c;而影响正常交付和服务&#xff0c;智慧工业是工业智能化和信息化的重要体现&#xff0c;在巡检方面自然也要同步提升&#xf…

使用Vue Query来获取数据

使用Vue Query来获取数据 构建现代大规模应用程序最具挑战性的方面之一是数据获取。加载和错误状态、分页、过滤、排序、缓存等功能会增加复杂性&#xff0c;并且经常会因大量样板代码而使应用程序变得臃肿。 vue query使用声明性语法处理和简化数据获取&#xff0c;并在幕后…

维深(Wellsenn):2023中国消费端VR内容开发商调研报告(附下载

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 国内互联网大厂商入局VR&#xff0c;字节跳动、网易表态明确。字节跳动2021年收购国内头部VR硬件厂商PICO后&#xff0c;加速构建VR内容生态&#xff0c;2021年 成立海南创见未来当前已推出VR视频应用…

大语言模型之三 InstructGPT训练过程

大语言模型 GPT历史文章中简介的大语言模型的的发展史&#xff0c;并且简要介绍了大语言模型的训练过程&#xff0c;本篇文章详细阐述训练的细节和相关的算法。 2020年后全球互联网大厂、AI创业公司研发了不少AI超大模型&#xff08;百亿甚至千亿参数&#xff09;&#xff0c;…