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,一经查实,立即删除!

相关文章

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;如果忘了或者不知道的人就会导…

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

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

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

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

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

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

声明v.s.定义

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

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;但其灵活性和可扩展…

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

语言的未来&#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下…

基于百度文心大模型全面重构,小度正式推出AI原生操作系统DuerOS X

4月16日&#xff0c;以“创造未来”为主题的2024百度Create AI开发者大会在深圳举办。百度集团副总裁、小度科技CEO李莹正式发布了小度新一代操作系统DuerOS X&#xff0c;该操作系统是小度基于百度文心大模型推出的全球首个AI原生操作系统。李莹表示&#xff1a;“作为⽂⼼⼤模…

【漏洞复现】IP-guard WebServer getdatarecord接口处存在权限绕过漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

基于Java+Vue的校园交友系统(源码+文档+包运行)

一.系统概述 选题背景&#xff1a; 在大学校园中&#xff0c;学生们面临着新的环境和人际关系的挑战。有些学生可能感到孤独或者希望扩展自己的社交圈子&#xff0c;寻找志同道合的朋友或者潜在的伴侣。因此&#xff0c;设计一款校园交友平台具有重要意义。 研究意义&#xff1…

Java内存模型和 JVM 内存运行时

文章目录 前言一、什么是Java 的内存模型&#xff1f;二、什么是 JVM 的运行时数据区Java8 之前和之后的区别JVM 内存模型JVM 内存区域JVM 内存垃圾回收JVM如何判断哪些对象不在存活&#xff1f;JVM运行过程中如何判断哪些对象是垃圾&#xff1f; JVM 垃圾回收Java8 中的 jvm如…

Google DeepMind: Many-Shot vs. Few-Shot

本文介绍了如何通过增大上下文窗口&#xff0c;利用大型语言模型&#xff08;LLMs&#xff09;进行多实例上下文学习&#xff08;Many-Shot In-Context Learning&#xff0c;ICL&#xff09;的方法。主要描述了现有的几实例上下文学习方法虽然在推理时能够通过少量例子学习&…

“全网最全”LLM推理框架集结营 | 看似微不足道,却决定着AIGC项目的成本、效率与性能!

00-前序 随着ChatGPT、GPT-4等大语言模型的出现&#xff0c;彻底点燃了国内外的学者们与企业家们研发LLM的热情。国内外的大语言模型如雨后春笋一般的出现&#xff0c;这些大语言模型有一部分是开源的&#xff0c;有一部分是闭源的。 伴随着大语言模型的出现&#xff0c;国内外…

树莓派驱动RGB灯-rpi-ws281x库安装

1 树莓派的操作系统安装 1.1 操作系统选择 这个选择64位的操作的系统来驱动&#xff0c;一定不要选择32位的操作系统。笔者在这个地方浪费不少时间&#xff0c;具体原因不是很清楚。如果32位的操作系统&#xff0c;后面在rpi-ws281x的库时候会有报错。 1.2 操作系统链接如下…