文件分块+断点续传 实现大文件上传全栈解决方案(前端+nodejs)

本文主要是介绍文件分块+断点续传 实现大文件上传全栈解决方案(前端+nodejs),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 文件分块

将大文件切分成较小的片段(通常称为分片或块),然后逐个上传这些分片。这种方法可以提高上传的稳定性,因为如果某个分片上传失败,只需要重新上传该分片而不需要重新上传整个文件。同时,分片上传还可以利用多个网络连接并行上传多个分片,提高上传速度。

2. 断点续传

在上传过程中,如果网络中断或上传被中止,断点续传技术可以记录已成功上传的分片信息,以便在恢复上传时继续上传未完成的部分,而不需要重新上传整个文件。这种技术可以大大减少上传失败的影响,并节省时间和带宽。

3. node项目目录初始化

在这里插入图片描述

  1. 安装依赖

    • express 敏捷启动服务
    • multer 读取文件,存储
    • cors 解决跨域
  2. 目录结构

    • src
      • TED.mp4 (长视频,10分钟,可以下载这个 https://mirror.aarnet.edu.au/pub/TED-talks/911Mothers_2010W-480p.mp4
    • uploads 存放切片
    • video 存放将切片拼接后的视频
    • index.html 前端页面

代码附上

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><input id="file" type="file" /><script>// functions// 实现切片的方法const makeChunk = (file, size = 1024 * 1024 * 4) => {const chunks = [];for (let i = 0; i < file.size; i += size) {const chunk = file.slice(i, i + size);chunks.push(chunk);}return chunks;};// 上传分片后的文件方法const uploadChunks = (chunks) => {// 1. 使用Promise.all保证所有上传方法执行成功// 2. 必须要给每个分片文件加标识,才可以让node端进行按序拼接const list = [];for (let i = 0; i < chunks.length; i++) {const formData = new FormData();formData.append("filename", "ted");formData.append("index", i);formData.append("chunk", chunks[i]); // 千万注意,切片文件要最后append否则会出现意外的buglist.push(fetch("http://localhost:3000/upload", {method: "POST",body: formData,}));}Promise.all(list).then((res) => {console.log("上传成功", res);fetch("http://localhost:3000/merge", {method: "POST",headers: {"Content-Type": "application/json",},body: JSON.stringify({fileName: "TED演讲10分钟长视频",}),});}).catch((err) => {console.error("上传失败", err);});};// logicconst file = document.querySelector("#file");file.addEventListener("change", (e) => {let file = e.target.files[0]; // 我们只处理单个文件因此取第一个元素即可// file是一个对象,底层继承于Blob,借助于Blob身上的slice方法,可以实现对大文件的分片操作console.log(file);const chunks = makeChunk(file);console.log("chunks:", chunks);uploadChunks(chunks);});</script></body>
</html>

index.js

import fs from "node:fs";
import path from "node:path";
import express from "express";
import multer from "multer";
import cors from "cors";console.log("cors:", cors);// 1. 初始化multer
const storage = multer.diskStorage({// 指定切片存放目录destination: function (req, file, cb) {cb(null, "../uploads/");},filename: function (req, file, cb) {console.log("req.body.index:", req.body.index);console.log("file", file);cb(null, `${req.body.filename}-${req.body.index}`);},
});const upload = multer({ storage });const app = express();
app.use(cors());
app.use(express.json());// upload.single("chunk") 其中chunk对应前端上传的文件切片名字
app.post("/upload", upload.single("chunk"), (req, res) => {console.log("req.body:", req.body);res.header("Content-Type", "application/json;charset=utf-8");res.send("ok");
});// 拼接切片
app.post("/merge", (req, res) => {// 获取uploadDir的目录const uploadDir = path.join(process.cwd(), "../uploads");const dirs = fs.readdirSync(uploadDir); // 发现是乱序的// 对dirs数组进行排序dirs.sort((a, b) => {return a.split("-")[1] - b.split("-")[1];});const videoDir = path.join(process.cwd(),"../video",`${req.body.fileName}.mp4`);dirs.forEach((item) => {// 合并成一个完整的文件至video目录fs.appendFileSync(videoDir, fs.readFileSync(path.join(uploadDir, item)));// 删除已合并的切片文件fs.unlinkSync(path.join(uploadDir, item));});console.log(dirs);res.send("okk");
});app.listen(3000, () => {console.log("server is running at port 3000");
});

最终效果

在这里插入图片描述
在这里插入图片描述

这篇关于文件分块+断点续传 实现大文件上传全栈解决方案(前端+nodejs)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950239

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too