当前位置: 首页 > java >正文

前端使用 spark-md5 实现大文件切片上传

需要计算文件MD5和、分片MD5:

封装公共方法代码如下:

import SparkMD5 from "spark-md5"/*** 计算文件MD5* @param file* @returns*/
export function calculateFileMD5(file) {return new Promise((resolve) => {const reader = new FileReader();reader.onload = function (e) {const spark = new SparkMD5.ArrayBuffer();spark.append(e.target.result);resolve(spark.end());};reader.readAsArrayBuffer(file);})
}/*** 计算分片MD5* @param chunk 当前切切片* @returns*/
export function calculateChunkMD5(chunk) {return new Promise((resolve) => {const reader = new FileReader();reader.onload = function (e) {const spark = new SparkMD5.ArrayBuffer();spark.append(e.target.result);resolve(spark.end());};reader.readAsArrayBuffer(chunk);})
}

在上传页面调用:

<template><form id="uploadForm"><div class="fileBox"><span class="fileLabel">文件:&nbsp; </span><input type="file" id="file" name="file"></div><el-progress id="progressBar" :percentage="progress" style="width: 335px;"></el-progress><button type="submit">提交</button></form>
</template><script setup>
import { calculateFileMD5, calculateChunkMD5 } from './calculateMd5'
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios'
import { getToken } from "@/utils/auth";
const emit = defineEmits(['send-upload'])
const uploadChunkUrl = ref(import.meta.env.VITE_APP_BASE_API + "/dbms/file/chunk"); //上传接口
const mergeUrl = ref(import.meta.env.VITE_APP_BASE_API + "/dbms/file/merge"); //合并接口const file = ref(null)
const progress = ref(0)async function uploadFile(file) {const chunkSize = 5 * 1024 * 1024; // 5MB每片const totalChunks = Math.ceil(file.size / chunkSize);const fileMd5 = await calculateFileMD5(file); // 计算整个文件的MD5for (let i = 0; i < totalChunks; i++) {const start = i * chunkSize;const end = Math.min(file.size, start + chunkSize);const chunk = file.slice(start, end);const chunkMd5 = await calculateChunkMD5(chunk); // 计算当前分片的MD5progress.value = Math.round((i / totalChunks) * 100) // 计算上传进度const formData = new FormData();formData.append('file', chunk);formData.append('chunkNumber', i + 1);formData.append('totalChunks', totalChunks);formData.append('fileMd5', fileMd5);formData.append('chunkMd5', chunkMd5);formData.append('fileName', file.name);await axios.post(uploadChunkUrl.value, formData, {headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'Bearer ' + getToken() }});}// 所有分片上传完成后,通知后端合并const res = await axios.post(mergeUrl.value, {fileMd5: fileMd5,fileName: file.name,totalChunks: totalChunks});// console.log(res)if (res.status == 200) {progress.value = 100ElMessage.success('文件上传成功!')// 上传成功 通知父组件关闭弹窗,清空下拉表单,更新列表数据emit('send-upload')}
}onMounted(async () => {/**触发上传**/document.getElementById("uploadForm").onsubmit = async function (event) {event.preventDefault();const fileInput = document.getElementById("file");file.value = fileInput.files[0];if (!file.value) {ElMessage.warning("请选择文件!")return;}uploadFile(file.value)}
})
</script>
http://www.xdnf.cn/news/9459.html

相关文章:

  • 68元开发板,开启智能硬件新篇章——明远智睿SSD2351深度解析
  • 黑马程序员C++核心编程笔记--3 函数高级
  • 技术视界 | 打造“有脑有身”的机器人:ABC大脑架构深度解析(下)
  • android-studio-2024.3.2.14如何用WIFI连接到手机(给数据线说 拜拜!)
  • git push Git远端意外挂断
  • 代码随想录算法训练营第60期第五十天打卡
  • LVS的DR模式部署
  • C++23:std::print和std::println格式化输出新体验
  • 沉浸式 VR 汽车之旅:汽车虚拟展厅与震撼试驾体验
  • Python编程8——面向对象编程3
  • 前端面经 React 组件常见的声明方式
  • 从零开始搞个简易分布式部署环境
  • 封装一个小程序选择器(可多选、单选、搜索)
  • 使用 Syncfusion 在 .NET 8 中生成 PDF/DOC/XLS/PPT
  • IPMI SOL (Serial over LAN) 排错与配置手册
  • DNS解析过程以及使用的协议名称
  • Redis击穿,穿透和雪崩详解以及解决方案
  • 睡眠分期 html
  • ArcGIS Pro裁剪影像
  • 4.8.4 利用Spark SQL实现分组排行榜
  • 油桃TV v20250519 一款电视端应用网站聚合TV播放器 支持安卓4.1
  • 苍茫命令行:linux模拟实现,书写微型bash
  • 项目代码工程优化之concurrent.futures异步编程(二)
  • 加密协议知多少
  • 【前端】PWA
  • Hadoop复习(二)
  • 网络协议入门:TCP/IP五层模型如何实现全球数据传输?
  • C++学习之STL学习:vector类的使用
  • flutter常用动画
  • c++ 调用opencv或pcl流程