vue3+vue-simple-uploader +SpringBoot实现大文件分块上传

效果图

一、安装所需依赖包

npm install vue-simple-uploader@next --save
npm install spark-md5 --save

二、main.ts 注册组件

import { createApp } from 'vue'
import uploader from 'vue-simple-uploader'
import 'vue-simple-uploader/dist/style.css'
import App from './App.vue'

const app = createApp(App)
app.use(uploader)
app.mount('#app')

三、创建uploader组件UploadChunk.vue

<template>
	<uploader
		ref="uploaderRef"
		:options="options"
		:autoStart="false"
		:file-status-text="fileStatusText"
		class="uploader-ui"
		@file-added="onFileAdded"
		@file-success="onFileSuccess"
		@file-progress="onFileProgress"
		@file-error="onFileError"
	>
		<uploader-unsupport></uploader-unsupport>
		<uploader-drop>
			<div>
				<uploader-btn :attrs="attrs">选择文件</uploader-btn>
			</div>
		</uploader-drop>
		<uploader-list></uploader-list>
	</uploader>
</template>

<script setup lang="ts">
import { reactive, ref } from 'vue';
import SparkMD5 from 'spark-md5';
import { ElMessage } from 'element-plus';
import { mergeFile } from '@/api/configuration/localTask'

// 记录是否上传过文件
const isUpload = ref(false)

const options = reactive({
	target: `http://xxxxx`,   // 目标上传 URL
	// 额外的自定义查询参数
	query: {},
	// query: (file: any, chunk: any) => {
	// 	return {
	// 		...file.params, 
	// 	}
	// },
	headers: {}, // 自定义头部信息
	chunkSize: 10240000, // 分块大小
	fileParameterName: 'upfile', // 上传文件时文件的参数名,默认file
	maxChunkRetries: 3, // 最大自动失败重试上传次数
	testChunks: true, // 是否开启服务器分片校验
	// 服务器分片校验函数
	checkChunkUploadedByResponse: function (chunk: any, response_msg: any) {
		let objMessage = JSON.parse(response_msg);
		if (objMessage.skipUpload) {
			return true;
		}
		return (objMessage.uploadedChunks || []).indexOf(chunk.offset + 1) >= 0;
	},
});
const attrs = reactive({
  accept: ['.xml']
});
const fileStatusText = reactive({
	success: '上传成功',
	error: '上传失败',
	uploading: '上传中',
	paused: '暂停',
	waiting: '等待上传',
});
const onFileAdded = (file: any) => {
	computeMD5(file);
}
 
const onFileSuccess = (rootFile: any, file: any, response: any, chunk: any) => {
	// 设置上传参数
	file.refProjectId = 'sxx-file';
	file.filename = file.name
	file.identifier = file.uniqueIdentifier
	mergeFile(file).then((res: any) => {
		ElMessage.success('上传成功!')
		isUpload.value = true
	}).catch((error) => {
		console.log(error)
	});
}
const onFileError = (rootFile: any, file: any, response: any, chunk: any) => {
	ElMessage({
		type: 'error',
		message: `上传失败!`
	})
}
 
// 计算md5值
function computeMD5(file: any) {
	file.pause();
	//单个文件的大小限制2G
	let fileSizeLimit = 2 * 1024 * 1024 * 1024;
	if (file.size > fileSizeLimit) {
		file.cancel();
	}
 
	let fileReader = new FileReader();
	let blobSlice = File.prototype.slice;
	let currentChunk = 0;
	const chunkSize = 10 * 1024 * 1000;
	let spark = new SparkMD5.ArrayBuffer();
	let chunkNumberMD5 = 1;
	loadNext();
	fileReader.onload = (e: any) => {
		spark.append(e.target.result);
		if (currentChunk < chunkNumberMD5) {
			loadNext();
		} else {
			let md5 = spark.end();
			file.uniqueIdentifier = md5;
			file.resume();
		}
	};
 
	fileReader.onerror = function () {
		ElMessage({
			type: 'error',
			message: `文件读取错误!`
		})
		file.cancel();
	};
 
	function loadNext() {
		let start = currentChunk * chunkSize;
		let end = start + chunkSize >= file.size ? file.size : start + chunkSize;
		fileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end));
		currentChunk++;
	}
}
</script>

<style scoped lang="scss">
.justify-content-center {
	width: 100%;
	display: flex;
	justify-content: center;
}
.uploader-ui {
	padding: 15px;
	margin: 40px auto 0;
	font-size: 12px;
	box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
	.uploader-btn {
		margin-right: 4px;
		font-size: 12px;
		border-radius: 3px;
		color: #fff;
		background-color: #409eff;
		border-color: #409eff;
		display: inline-block;
		line-height: 1;
		white-space: nowrap;
	}
	.uploader-list {
		max-height: 440px;
		overflow: auto;
		overflow-x: hidden;
		overflow-y: auto;
	}
}
</style>
四、组件使用
<template>
	<div>
		<upload-chunk />
	</div>
</template>
<script setup lang="ts">
import UploadChunk from './UploadChunk.vue';
</script>

五、后台java相关代码

            vue+springboot实现大文件上传-CSDN博客

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值