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

用spark-md5实现切片上传前端起node模拟上传文件大小,消耗时间

1 安装依库 npm install spark-md5 --save

2 引入 import SparkMD5 from "spark-md5";

3pnpm install express multer cors

4  打开终端 cmd node启动 node bigfileserver.js

前端代码BigFileshangchuan.vue

<template><div class="upload-container"><input type="file" @change="handleFileChange" /><button @click="upload" :disabled="!file">上传</button><div v-if="progress > 0" class="progress">上传进度:{{ progress.toFixed(2) }}%</div></div>
</template><script setup>
import { ref } from "vue";
import SparkMD5 from "spark-md5";
// 1 安装依库 npm install spark-md5 --save
// 2 引入 import SparkMD5 from "spark-md5";
const file = ref(null);
const progress = ref(0);
const chunkSize = 3 * 1024 * 1024; // 每片3MBfunction handleFileChange(e) {file.value = e.target.files[0];console.log("🚀 ~ handleFileChange ~ file.value :", file.value )
}// 上传主流程
async function upload() {if (!file.value) return;console.log("🚀 ~ upload ~ file.value:", file.value)const fileSize = file.value.size;console.log("🚀 ~ upload ~ fileSize:", fileSize)const chunkCount = Math.ceil(fileSize / chunkSize);// 存储切片const chunkAll = [];const spark = new SparkMD5.ArrayBuffer();// 逐片生成for (let i = 0; i < chunkCount; i++) {const chunkItem = await createChunk(file.value, i, chunkSize);chunkAll.push(chunkItem);progress.value = ((i + 1) / chunkCount) * 50; // 生成分片阶段进度}// 计算整文件MD5const fullMd5 = await calculateFileMD5(file.value);// 构造 FormDataconst formData = new FormData();chunkAll.forEach((item) => {formData.append("chunk", item.blob, `chunk${item.index}`);});formData.append("MD5", fullMd5);// 发送请求
//   const res = await fetch("http://localhost:3000/upload", {
//     method: "POST",
//     body: formData,
//   });const res = await fetch("http://localhost:3000/upload", {method: "POST",body: formData,
});const result = await res.json();console.log(result);progress.value = 100;alert("上传完成!");
}// 生成单个分片
function createChunk(file, index, chunkSize) {return new Promise((resolve) => {const start = index * chunkSize;const end = Math.min(file.size, start + chunkSize);const blob = file.slice(start, end);const spark = new SparkMD5.ArrayBuffer();const reader = new FileReader();reader.readAsArrayBuffer(blob);reader.onload = (e) => {spark.append(e.target.result);resolve({index,start,end,MD5: spark.end(),blob,});};});
}// 计算整文件MD5
function calculateFileMD5(file) {return new Promise((resolve) => {const reader = new FileReader();const spark = new SparkMD5.ArrayBuffer();reader.readAsArrayBuffer(file);reader.onload = (e) => {spark.append(e.target.result);resolve(spark.end());};});
}
</script><style scoped>
.upload-container {padding: 20px;
}
button {margin-left: 10px;padding: 5px 10px;
}
.progress {margin-top: 10px;color: #2c7a7b;
}
</style>

模拟后端代码bigfileserver.js


/* 
模拟后端大文件分片上传服务
1pnpm init -y
2pnpm install express multer cors
3  打开终端 cmd node启动 node bigfileserver.jsexpress:Web 框架multer:处理 multipart/form-data(文件上传)cors:允许前端跨域请求
*/
import express from "express";
import multer from "multer";
import cors from "cors";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";// __dirname 在 ES Module 下需要自己定义
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);const app = express();
const PORT = 3000;app.use(cors());// 设置上传目录
const upload = multer({ dest: "uploads/" });// 用于记录上传开始时间
let startTime = null;app.post("/upload", upload.array("chunk"), (req, res) => {if (!startTime) startTime = Date.now();let totalSize = 0;console.log("接收到分片数量:", req.files.length);// 保存分片,同时累加总文件大小req.files.forEach((file) => {const targetPath = path.join(__dirname, "uploads", file.originalname);fs.renameSync(file.path, targetPath); // 保存分片totalSize += file.size;console.log(`分片: ${file.originalname}, 大小: ${(file.size / 1024 / 1024).toFixed(2)} MB`);});console.log(`本次请求上传总大小: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);// 判断是否最后一片,这里假设前端最后一个请求 MD5 最大值已传const md5 = req.body.MD5;if (md5) {const endTime = Date.now();console.log(`上传完成,总耗时: ${(endTime - startTime) / 1000}s`);console.log(`整文件大小: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);startTime = null;}res.json({ code: 0, msg: "分片上传成功" });
});app.listen(PORT, () => {console.log(`Server running on http://localhost:${PORT}`);
});

http://www.dtcms.com/a/581308.html

相关文章:

  • 做网站优化竞价区别开发工具的种类及使用方法
  • Mac安装pnpm步骤以及会出现的问题
  • ofd在线预览js+springboot跳转
  • 基于SpringBoot实习管理系统的设计与实现的设计与实现
  • abuild的使用说明-如何使用vscode进行c/c++开发
  • 宝山php网站开发培训可以看那种东西的手机浏览器
  • 算法28.0
  • Spring Cloud中的@LoadBalanced注解实现原理
  • 建站快车的使用方法电子商务网站对比分析
  • 分布式Web应用场景下存在的Session问题
  • 12.线程(一)
  • 如何做二维码跳转到网站建设网站专家
  • 前端i18n实现中英文切换
  • Java基础——常用算法4
  • SQL50+Hot100系列(11.7)
  • Python 第二十六节 多线程应用详细介绍及使用注意事项
  • 网站建设交接表wordpress编程视频教程
  • LeafView(轻量级电脑图片查看器) v3.8.1 中文绿色便携版
  • MySQL死锁问题分析与解决方案
  • shell中获取达梦信息方法示例
  • calibre QRC提取寄生参数
  • 【Hot100 |5-LeetCode 11. 盛最多水的容器】
  • 【MicroPython编程-ESP32篇】-DH11温度湿度传感器驱动
  • 字节deer-flow项目模块详解
  • 【Python】Python并发与并行编程图解
  • 清城网站seodiscuz自适应模板
  • 优秀网页设计网站是wordpress php开发
  • 内部网关协议——OSPF 协议(开放最短路径优先)(链路状态路由协议)
  • rman-08137:warning:archived log not deleted
  • 专业的开发网站建设价格虚拟云电脑