【前端】大文件切片上传性能优化 使用 web worker 多线程

线程代码

worker.js

//实例化一个 XMLHttpRequest 对象
let xhr = new XMLHttpRequest();
let 延迟关闭线程等待时间毫秒 = 6000function 取消上传(){try {xhr.abort()}catch (e) {}
}addEventListener('message', e => {const { type, data } = e.data// console.log('子线程:',data)switch (type){case '上传文件':上传文件(data.file,data.第几个, data.子线程id)breakcase '取消上传':取消上传()breakcase '安全关闭线程':取消上传()setTimeout(self.close, 延迟关闭线程等待时间毫秒)breakcase '关闭线程':self.close()breakdefault:console.log('未知命令')break}// postMessage('子线程发送的消息')
})function 上传文件 (file, 第几个, 子线程id){console.log('子线程id:' + 子线程id + ', 第:' + 第几个 + '片-开始上传')// 这个要放到调用open函数之前!!!xhr.upload.onprogress = function (e) {//  e.lengthComputable 是一个布尔值,表示当前上传的资源是否具有可计算的长度if (e.lengthComputable) {// 多个文件总共大小,以及已上传大小// console.log(e.total,e.loaded);// e.loaded 已传输的字节  e.total 文件传输需要的总字节var percentComplete = Math.ceil((e.loaded / e.total) * 100); // Math.ceil() 向上取整// console.log('子线程id:' + 子线程id + ', 第几片:' + 第几个 + '-当前进度:', percentComplete)}};// 文件上传成功xhr.upload.onload = function () {// console.log('文件上传完成')};// open 必须放 xhr.send() 前面//设置请求方式及接口地址xhr.open('POST', 'http://127.0.0.1:8088/robot/flow/upload', true);// xhr.setRequestHeader('Content-Type', 'application/octet-stream');xhr.onload = function () {// self.postMessage({ status: 'chunk_uploaded', message: 'Chunk uploaded successfully' });};xhr.onerror = function () {console.log('上传出错-子线程id:' + 子线程id + ', 第:' + 第几个 + '片')// self.postMessage({ status: 'error', message: 'Error uploading chunk' });};const formData = new FormData();formData.append('file', file);// formData.append('currentChunk', currentChunk + 1);// formData.append('totalChunks', totalChunks);xhr.onreadystatechange = (e) => {  //服务端响应后/*0 未打开,xhr.open()方法还未被调用.1 未发送, xhr.send()方法还未被调用.2 已获取响应头,xhr.send()方法已经被调用, 响应头和响应状态已经返回.3 正在下载响应体, xhr.响应体下载中; responseText中已经获取了部分数据.4 请求完成, 整个请求过程已经完毕.* */if (xhr.readyState == 4) {  //判断客户端是否可以使用if(xhr.status == 200){    //表示成功处理请求// 如果定义为  xhr.responseType='json';,控制台包提示格式错误,建议不设置,使用默认设置console.log('子线程id:' + 子线程id + ',第几片:' + 第几个 + '-上传完成:', xhr.responseText)self.postMessage({ type:'上传完成', success: true, message: '上传成功' });}else{console.log(xhr.status+' '+xhr.statusText)}}}// 一般放在最后xhr.send(formData)
}export default {}

引用线程 指定线程数

import Worker from "worker-loader!@/workers/worker";
//线程集合
var workers = []
const 线程数 = 5

代码  vue js 都可用

<template><div><input type="file" id="fileInput" /><a-button @click="点击上传按钮" type="primary">上传</a-button><a-button @click="取消上传" type="primary">取消上传</a-button>
<!--    进度条--><progress id="progressBar" max="100" value="0"></progress><div id="status"></div></div>
</template>
<script>import Worker from "worker-loader!@/workers/worker";
//线程集合
var workers = []
const 线程数 = 5
//文件
var file;export default {components: {},data() {let that = thisreturn {当前第几片 : 0,总片数 : 0,每片大小: 1024 * 1024 * 99, // 99 MB chunks (adjust as needed)}},setup(){// console.log(this.$route.currentRoute.value.query)// const StrUtil = this.$WTool.StrUtil},created() {let that = this},mounted() {},methods: {初始化线程(){let that = this//关闭之前的线程for (let i = 0; i < workers.length; i++) {workers[i].postMessage({type:'安全关闭线程'})}//清空线程workers = []//初始化线程for (let i = 0; i < 线程数; i++) {workers.push(new Worker())console.log('初始化线程:' + (i+1))}//初始化线程监听回调for (let i = 0; i < workers.length; i++) {let worker = workers[i]worker.onmessage = e => {const { type, success } = e.dataswitch (type){case '上传完成':// console.log('主线程:上传完成,继续调用上传方法')that.开始上传文件(i)breakdefault:console.log('未知命令', type)break}}console.log('初始化线程onmessage:' + (i+1))}},取消上传(){console.log('取消上传开始')for (let i = 0; i < workers.length; i++) {workers[i].postMessage({type:'安全关闭线程'})}console.log('取消上传结束')},点击上传按钮(){//获取文件file = document.getElementById('fileInput').files[0]//切片this.总片数 = Math.ceil(file.size / this.每片大小);console.log('分片数量:' + this.总片数)this.初始化线程()//开始上传for (let i = 0; i < workers.length; i++) {this.开始上传文件(i);}},开始上传文件(子线程id){let that = this//获取线程let worker = workers[子线程id]if(that.当前第几片 >= that.总片数){console.log('第几个线程:' + 子线程id + ', 上传结束')return}const start = that.当前第几片 * this.每片大小;const end = Math.min(file.size, start + this.每片大小);//文件切片const chunk = file.slice(start, end);if(chunk){// console.log("子线程id:" + 第几个线程 + '-线程,让子线程上传文件,当前第几片:', that.当前第几片)worker.postMessage({type:'上传文件', data:{file:chunk, 第几个:that.当前第几片, 子线程id:子线程id}})that.当前第几片++}}}
}</script><style></style>

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

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

相关文章

自定义Vue的DockPanel-Layout

创作来源 1、在vue项目中需要有停靠、浮动、面板布局等需求&#xff0c;如arcgis的界面布局 2、在npm中搜索了关于vue的docklayout组件&#xff0c;搜索后就一个组件imengyu/vue-dock-layout&#xff0c;截图如下&#xff0c;该组件没有停靠组件&#xff0c;没有浮动组件&…

scrapy爬虫中间件和下载中间件的使用

一、关于中间件 之前文章说过&#xff0c;scrapy有两种中间件&#xff1a;爬虫中间件和下载中间件&#xff0c;他们的作用时间和位置都不一样&#xff0c;具体区别如下&#xff1a; 爬虫中间件&#xff08;Spider Middleware&#xff09; 作用&#xff1a; 爬虫中间件主要负…

浏览器垃圾回收机制的几种回收方法

前言 浏览器垃圾回收机制是指浏览器对内存中不再使用的对象进行自动回收和释放的过程。浏览器垃圾回收机制的目的是为了防止内存泄漏&#xff0c;提高程序的性能和稳定性。 原理 基于可达性的概念&#xff0c;即从一个或多个根对象出发&#xff0c;能够通过引用或指针找到的对…

数据结构基础(顺序表)

顺序表完整代码 SeqList.hSeqList.ctest.c SeqList.h #pragma once#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h>//#define N 1000 //typedef int SLDataType;静态顺序表 //typedef struct SeqList { // SLDataTy…

Python+Requests对图片验证码的处理

Requests对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过request做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过request对图片验…

Vscode中字符串报错:Unknown word.cSpell

一. 报错现象 二. 原因 是vscode IDE工具中的插件 Code Spell Checker 会检查字符串的合理性&#xff0c;我们写的中式拼音的字符串&#xff0c;不是一个标准英文单词&#xff0c;就会提示错误&#xff0c;解决方法就是让该插件遇到特定词汇不报错 三. 解决方法

macOS本地调试k8s源码

目录 准备工作创建集群注意点1. kubeconfig未正常加载2. container runtime is not running3. The connection to the server 172.16.190.132:6443 was refused - did you specify the right host or port?4. 集群重置5.加入子节点 代码调试 准备工作 apple m1芯片 安装vmwa…

TCP_报文格式解读

报文格式 header部分字段含义解析 固定字段 对于header中固定部分字段含义&#xff0c;见之前的blog《TCP报文分析》&#xff1b; 对部分字段含义补充说明 Data Offset&#xff1a;4bit&#xff0c;tcp header的长度&#xff0c;单位&#xff1a;32bit&#xff08;4字节&…

指针(3)

如图&#xff0c;这是比较常见的冒泡排序&#xff0c;不过只能对整形数据进行排序。本篇博文主要介绍如何模拟qsort函数实现冒泡排序对任何数据的排序。 如果我们想对任何数据进行排序&#xff0c;我们可以发现&#xff0c;排序的趟数是固定的&#xff0c;我们只需要对比较大…

大数据Doris(三十一):Doris简单查询

文章目录 Doris简单查询 一、简单查询 二、Join

linux(3)之buildroot配置软件包

Linux(3)之buildroot配置软件包 Author&#xff1a;Onceday Date&#xff1a;2023年11月30日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Buildroot - Making Embedded Linux Easymdev.txt docs - busybox - BusyBox: The Swiss Army Knife of Embedded Linu…

组合(回溯+剪枝、图解)

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 样例输入 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],…

Unittest单元测试之unittest用例执行顺序

unittest用例执行顺序 当在一个测试类或多个测试模块下&#xff0c;用例数量较多时&#xff0c;unittest在执行用例 &#xff08;test_xxx&#xff09;时&#xff0c;并不是按从上到下的顺序执行&#xff0c;有特定的顺序。 unittest框架默认根据ACSII码的顺序加载测试用例&a…

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标) 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)预测效果基本介绍环境准备程序设计参考资料预测效果 基本介绍

ChatGPT一周年,奥特曼官宣 OpenAI 新动作!

大家好&#xff0c;我是二狗。 今天是11月30日&#xff0c;一转眼&#xff0c;ChatGPT 发布已经一周年了&#xff01; 而就在刚刚&#xff0c;ChatGPT一周年之际。 OpenAI 正式宣布Sam Altman回归重任CEO, Mira Murati 重任CTO&#xff0c;Greg Brockman重任总裁&#xff0c;O…

无需繁琐编程 开启高效数据分析之旅!

不学编程做R统计分析&#xff1a;图形界面R Commander官方手册 R Commander是 R 的图形用户界面&#xff0c;不需要键入命令就可通过熟悉的菜单和对话框来访问 R 统计软件。 R 和 R Commander 均可免费安装于所有常见的操作系统——Windows、Mac OS X 和 Linux/UNIX。 本书作…

LeetCode Hot100 169.多数元素

题目&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 方法一&#xff1a;哈希表 ​ class Solution {public int…

【android开发-06】android中textview,button和edittext控件的用法介绍

1&#xff0c;TextView控件使用代码参考用例 在Android中&#xff0c;我们通常使用XML来定义布局和设置视图属性。以下是一个TextView的XML布局设置示例&#xff1a; 1.1在res/layout目录下的activity_main.xml文件中定义一个TextView&#xff1a; <TextView android:id…

FATFS基本入门教程(2)-什么是文件系统

作者注&#xff1a;FATFS应该是一个比较常用的嵌入式文件系统&#xff0c;支持FAT12/FAT16/FAT32/EXFAT格式&#xff0c;很多开发人员都用过。我在这里会写一系列文章来介绍FATFS的基本使用&#xff0c;欢迎感兴趣的同学关注。 已发布的内容&#xff1a; FATFS基本入门指南&…

wordpress安装之Linux ftp传输

工欲善其事,必先利其器。 最近准备在自己的服务器上搭建一个个人技术分享的平台。 因为我发现现在网络上的工具呀&#xff0c;还有一些问题的解答总是模棱两可&#xff0c;所以我打算自己做一个。 首先呢&#xff0c;我们需要有一个linxu的系统当服务器&#xff0c;然后呢&a…