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

前端使用 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>

相关文章:

  • JDBC+HTML+AJAX实现登陆和单表的CRUD
  • apptrace 视角下移动端深度链接技术与优势​
  • 把数据库做得能扩展:Aurora DSQL 的故事
  • LeetCode-数组技巧题目
  • 使用jessibuca+wvp+zlm实现html无插件播放摄像头实时画面
  • 【大模型】Bert
  • #!/usr/bin/env python
  • 【网络通信】详解网络通信、实现 CS / BS架构 通信
  • HTML实战:响应式个人资料页面
  • 【容器】docker使用问题处理
  • Eclipse 插件开发 5.3 编辑器 监听输入
  • React Context 与状态管理:用与不用
  • 【数据分析】特征工程-特征选择
  • JS语言基础
  • 【华为战报】4月、5月 HCIP考试战报!
  • 将 AI 解答转换为 Word 文档
  • 题目 3314: 蓝桥杯2025年第十六届省赛真题-魔法科考试
  • 一篇学习CSS的笔记
  • 【深度学习】10. 深度推理(含链式法则详解)RNN, LSTM, GRU,VQA
  • 进阶知识:Selenium底层原理深度解析
  • 英文垃圾站wordpress/营销助手下载app下载
  • 网站建设的英语/权重查询站长工具
  • 做kegg通路富集的网站/公司网站制作要多少钱
  • 《高性能网站建设指南》/开发一个网站需要多少钱
  • 怎么给婚恋网站做情感分析/海外seo网站推广
  • 设计装修的软件/宁波seo关键词如何优化