vue3 文件分片上传

base 64 分片上传文件

<template><div><input type="file" @change="onFileSelected" /><button v-if="file && !isUploading" @click="startUpload">开始上传</button><button v-if="isUploading" @click="pauseUpload">暂停上传</button><button v-if="isUploading" @click="resumeUpload">继续上传</button><p>已上传分片: {{ uploadedChunks }} / {{ totalChunks }}</p><progress :value="uploadedChunks" :max="totalChunks"></progress></div>
</template><script setup>
const file = ref(null);
const isUploading = ref(false);
const uploadedChunks = ref(0);
const totalChunks = ref(0);const chunkSize = 10 * 1024 * 1024; // 分片大小:1MB
let currentChunkIndex = 0;function onFileSelected(event) {file.value = event.target.files[0];if (file.value) {totalChunks.value = Math.ceil(file.value.size / chunkSize);}
}async function startUpload() {isUploading.value = true;await readAndUploadFileInChunks(file.value, chunkSize);isUploading.value = false;alert('文件上传完成!');
}function pauseUpload() {isUploading.value = false;
}function resumeUpload() {isUploading.value = true;// 实现暂停/继续逻辑,这里假设简单地重新开始上传startUpload();
}async function readAndUploadFileInChunks(file, chunkSize) {const fileReader = new FileReader();let offset = 0;while (offset < file.size) {const slice = file.slice(offset, offset + chunkSize);fileReader.readAsDataURL(slice); // 使用readAsDataURL读取Base64编码await new Promise((resolve) => {fileReader.onload = () => {const base64Data = fileReader.result;uploadBase64Chunk(base64Data, currentChunkIndex++);resolve();};});offset += chunkSize;}
}async function uploadBase64Chunk(base64Data, index) {try {const response = await fetch('/api/upload-base64-chunk', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ base64Data, index }),});if (!response.ok) {throw new Error(`Failed to upload chunk ${index}: ${response.status}`);}uploadedChunks.value = index + 1;} catch (error) {console.error('Error uploading chunk:', error);// 处理错误,可能需要重新上传或提示用户}
}onMounted(() => {// 在组件挂载时注册相关事件
});onBeforeUnmount(() => {// 在组件卸载时清理资源
});// return {
//   file,
//   isUploading,
//   uploadedChunks,
//   totalChunks,
//   onFileSelected,
//   startUpload,
//   pauseUpload,
//   resumeUpload,
// };
</script>

文件流分片上传

<template><div><input type="file" @change="onFileSelected" /><button v-if="file && !isUploading" @click="startUpload">开始上传</button><button v-if="isUploading" @click="pauseUpload">暂停上传</button><button v-if="isUploading" @click="resumeUpload">继续上传</button><p>已上传分片: {{ uploadedChunks }} / {{ totalChunks }}</p><progress :value="uploadedChunks" :max="totalChunks"></progress></div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';const file = ref(null);
const isUploading = ref(false);
const uploadedChunks = ref(0);
const totalChunks = ref(0);const chunkSize = 10 * 1024 * 1024; // 分片大小:10MB
let worker = null;
let uploadQueue = [];
let currentChunkIndex = 0;function onFileSelected(event) {file.value = event.target.files[0];if (file.value) {totalChunks.value = Math.ceil(file.value.size / chunkSize);}
}async function startUpload() {isUploading.value = true;worker = new Worker('file-slicer-worker.js');worker.postMessage({ file: file.value, chunkSize });worker.onmessage = ({ data }) => {if (data.type === 'slice') {uploadQueue.push(data.chunk);uploadNextChunk();}};
}function pauseUpload() {isUploading.value = false;
}function resumeUpload() {isUploading.value = true;uploadNextChunk();
}async function uploadNextChunk() {if (!isUploading.value || currentChunkIndex >= totalChunks.value) return;const chunk = uploadQueue.shift();await uploadChunk(chunk, currentChunkIndex++);uploadedChunks.value = currentChunkIndex;if (currentChunkIndex < totalChunks.value) {uploadNextChunk();} else {// 全部上传完毕,清理资源worker.terminate();worker = null;uploadQueue = [];isUploading.value = false;alert('文件上传完成!');}
}async function uploadChunk(chunk, index) {const formData = new FormData();formData.append('file', new Blob([chunk]), `file_part_${index}`);try {const response = await fetch('/api/upload-chunk', {method: 'POST',body: formData,});if (!response.ok) {throw new Error(`Failed to upload chunk ${index}: ${response.status}`);}} catch (error) {console.error('Error uploading chunk:', error);// 处理错误,可能需要重新放入队列或提示用户}
}onMounted(() => {// 在组件挂载时注册worker相关事件
});onBeforeUnmount(() => {// 在组件卸载时清理worker资源if (worker) {worker.terminate();}
});// return {
//   file,
//   isUploading,
//   uploadedChunks,
//   totalChunks,
//   onFileSelected,
//   startUpload,
//   pauseUpload,
//   resumeUpload,
// };
</script>

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

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

相关文章

Go 之获取变量类型

Python 可以通过 type 快速获取变量类型。Ruby 也可以通过 class 方法快速获取变量类型。 lists [1, 2, 3, 4, 5] print(type(lists)) # <class list>lists [1, 2, 3, 4, 5] puts lists.class # Array 那么 Go 有哪些获取变量类型的方法呢&#xff1f; fmt.Printf(&…

JavaWeb开发02-MYSQL-DDL-DML-DQL-多表设计-多表查询-事务-索引

一、MySQL概述 通过SQL语句可以操作数据库 关系型数据库&#xff1a; 只要是关系型数据库就可以用SQL语句这一统一标准进行操作数据库 1.MYSQL数据模型 客户端通过SQL语句交给了数据库管理系统DBMS&#xff0c;进行相应操作&#xff0c;创建一个一个数据库&#xff0c;体现为一…

如何理解信创产品?成为信创产品?

信创产品是指运用信息技术手段创造的产品&#xff0c;它是数据安全、网络安全的基础&#xff0c;也是新基建的重要组成部分。信创产品包括了IT基础设施如CPU芯片、服务器、存储、交换机、路由器、各种云和相关服务内容&#xff1b;基础软件如数据库、操作系统、中间件&#xff…

JRT在线初始化完善

之前实现的在线初始化留了个尾巴&#xff0c;那就是环境下载页构造zip包的时候没修改JRTBrowser的连接串地址为当前网站&#xff0c;这样就要求网站部署好之后给用户下载之前有人要把服务器的浏览器地址配置好。这样就增加一个运维工作&#xff0c;如果忘了或者不知道的人就会导…

利用H.264码流传输摄像头地理位置信息

目录 1. 引言2. NALU格式介绍3. SEI格式介绍4. 举例5. 推广1. 引言 摄像头的应用范围越来越广泛,从安防监控到视频会议,它们在我们的日常生活中起着关键作用。除了视频图像本身,摄像头还可以提供其他有用的信息,例如摄像头的地理位置。本文将讨论如何利用H.264码流传输摄像…

if __name__ == ‘__main__‘ 是个什么鬼?

有句话经典的概括了这段代码的意义&#xff1a; “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用&#xff0c;另外该模块自己也可执行。 咋一看&#xff0c;其实我也不理解到底是个什么球意思&#xff0c;这里我们写两个…

nuxt3使用记录四:加载静态资源时路径的写法研究

在上一篇记录了NUXT进行SSG构建时&#xff0c;不仅会构建纯静态的html文件&#xff0c;也会构建一堆js文件。而如果网页中有加载静态资源&#xff0c;如图片&#xff0c;这时就需要注意了&#xff0c;不能简单的使用官网说的<img src"~/assets/img/nuxt.png" alt&…

2024年华中杯数学建模C题思路与论文助攻

C 题 基于光纤传感器的平面曲线重建算法建模 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号&#xff0c;其 基本原理是当外界环境参数发生变化时&#xff0c;会引起光纤传感器中光波参量&am…

Linux进阶---常见符号及其含义、常见报错

一、常见符号及其含义&#xff08;重要&#xff09; 二、 常见报错 • 找不到文件、文件不存在&#xff1a;No such file or directory • 没有权限 &#xff1a;Permission denied • 命令不存在 &#xff1a;command not found 1.找不到文件、文件不存在&#xff1a;No s…

logstash迁移es自建数据到pass服务

1 安装 下载对应版本的tar文件 https://www.elastic.co/cn/downloads/past-releases#logstash解压 tar -zvxf logstash-6.8.23-linux-x86_64.tar.gz 2 配置 修改Logstash的堆内存使用vi config/jvm.options&#xff0c;修改Logstash配置文件config/jvm.options&#xff0c;增…

AI智能电销机器人是什么?能给我们带来哪些便利?

科技的飞速发展&#xff0c;让很多“懒人”的幻想变成了现实&#xff0c;越来越多的人工智能产品被发明出来甚至完全替代日常生活中的工作。比如在电销行业&#xff0c;很多企业选择AI智能电销机器人进行外呼。那么你了解多少AI智能电销机器人呢&#xff1f;和小编kelaile520一…

声明v.s.定义

参考&#xff1a;http://t.csdnimg.cn/1xnzA 变量的定义&#xff1a;用于为变量分配存储空间&#xff0c;还可以为变量指定初始值&#xff0c;在程序中&#xff0c;变量有且仅有一个定义。变量的声明&#xff1a;用于向程序表明变量的类型和名字。在程序中&#xff0c;变量可以…

React参数传递问题

问题描述 <div className"reply-list">{/* 评论项 */}{list.map((item) > {console.log("map 里面的item", item);return <CommentItem item{item} />; // 调用组件并传递参数item})}</div> // 在组件中使用形参 function CommentI…

SAP SD学习笔记06 - 受注的据否,受注的理由,简易变更(一括处理)

上文讲了一括处理和Block&#xff08;冻结&#xff09;处理。 SAP SD学习笔记05 - SD中的一括处理&#xff08;集中处理&#xff09;&#xff0c;出荷和请求的冻结&#xff08;替代实现承认功能&#xff09;-CSDN博客 本章继续讲SAP的流程中一些常用的操作。 1&#xff0c;受注…

Flume 入门教程

内容目录 Flume 简介 架构和基本概念 多种架构模式 Flume 安装部署 Flume 简介 Flume 是一个分布式、可靠且高可用的数据收集、聚合和传输系统&#xff0c;主要用于高效地处理大规模日志数据。设计之初&#xff0c;它主要服务于日志管理领域&#xff0c;但其灵活性和可扩展…

Docker中Kafka容器创建/更新Topic支持多分区

前提 自行通过docker部署好kafka&#xff0c;并启动相关容器。 假设Topic为http_capture。 #docker-kafka kafka_dir/opt/docker/kafka/build sudo rm -rf ${kafka_dir}/* cat > ${kafka_dir}/docker-compose.yml <<EOF version: "3.3" services:zookeepe…

语言的未来:深度学习在自然语言处理中的革命

语言的未来&#xff1a;深度学习在自然语言处理中的革命 1 引言 自古以来&#xff0c;语言就是人类表达思想、传递信息、进行社会互动的基石。语言的复杂性既体现在其变化多端的语义、句法和语用层面&#xff0c;同时也反映在人类如何理解和产生自然语言的深奥之中。在这一节中…

009、Python+fastapi,第一个后台管理项目走向第9步:ubutun 20.04下安装vscode+git环境配置

一、说明 git是一定要配置的&#xff0c;由于是白嫖的无影云电脑&#xff0c;东西得保存在网上&#xff0c;就继续白嫖gitee吧&#xff0c;显然国内github是不太合适的了 二、安装git 直接安装sudo apt install -y git git --version git version 2.25.1 三、配置git 在git上…

OSPF星型拓扑和MGRE全连改

一&#xff0c;拓扑 二&#xff0c;要求 1&#xff0c;R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段 2&#xff0c;R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c; 3&#xff0c;R1为中心站点所有私有网段可以互相通讯&#xff0c;私有网段…

Spring AI,调用OpenAI大模型接口,让ChatGPT给你讲笑话

前言 Spring最近刚刚推出了SpringAI&#xff0c;封装了AI大模型接口的使用。本文将参考Spring官网案例&#xff0c;一步步教你如何调用OpenAI的接口&#xff0c;让ChatGPT接口返回一个笑话。 前提条件 请下载并安装好JDK17或更新的版本&#xff0c;本文使用的是JDK21。JDK下…