Node.js接收文件分片数据并进行合并处理

devtools/2025/1/22 8:40:28/

前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。

目录:

  • 一、文件结构
  • 二、主要依赖
    • 1. `express`
    • 2. `multer`
    • 3. `fs` (文件系统模块)
    • 4. `path`
    • 5. `cors`
    • 6. `body-parser`
    • 总结:
  • 三、示例代码

一、文件结构

在这里插入图片描述

  1. chunks:文件分片存储;
  2. node_modules:依赖;
  3. uploads:合并后的文件存储目录;
  4. index.js:程序主文件;

二、主要依赖

1. express

javascript">const express = require('express');
  • 作用express 是一个流行的 Node.js Web 框架,它提供了一组简单的工具和功能,用于构建 Web 服务器和处理 HTTP 请求。它简化了路由、请求和响应的处理,使开发者能够更快速地构建 Web 应用。
  • 用法:通过 express() 创建应用实例并处理路由、请求、响应等。
  • 下载
npm i express -S

2. multer

javascript">const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
  • 作用multer 是一个 Node.js 中间件,专门用于处理 multipart/form-data 类型的表单数据,尤其是文件上传。它可以将上传的文件保存到磁盘、内存或自定义位置。
  • 用法multer 配置了存储路径 dest: 'uploads/',表示将上传的文件临时保存在 uploads/ 目录下。通过 upload.single('file')upload.array('files') 可以处理单个文件或多个文件的上传。
  • 下载
npm i multer -S

3. fs (文件系统模块)

javascript">const fs = require('fs');
  • 作用fs 是 Node.js 内置的文件系统模块,提供了用于文件和目录操作的 API。它允许你读取文件、写入文件、删除文件、列出目录等。
  • 用法fs 允许对本地文件系统执行同步和异步操作,常用于文件上传、存储、读取等操作。

4. path

javascript">const path = require('path');
  • 作用path 是 Node.js 内置模块,提供了一些用于处理文件和目录路径的实用工具函数。它使得路径的操作变得更加简单且跨平台。
  • 用法:常见的用法包括拼接路径、解析路径、获取文件扩展名等。例如,path.join() 用于安全地拼接路径,path.extname() 获取文件的扩展名。

5. cors

javascript">const cors = require('cors');
  • 作用cors 是一个中间件,用于处理跨源资源共享(CORS)请求。CORS 是一种机制,允许在不同域之间进行资源共享。cors 中间件允许你设置哪些源(域)可以访问服务器的资源。
  • 用法:通过 app.use(cors()) 启用跨域请求支持,允许所有域访问该服务器。你也可以通过 cors({origin: 'http://example.com'}) 配置只允许指定的源访问。
  • 下载
npm i cors -S

6. body-parser

javascript">const Parser = require("body-parser");
  • 作用body-parser 是 Express 中间件的一个旧版库,用于解析请求的 body 部分。它支持将请求体解析为 JSON、URL 编码格式等,并将解析后的数据附加到 req.body 上。
  • 用法:可以使用 Parser.json()Parser.urlencoded() 来分别解析 JSON 数据和 URL 编码的数据。
    • Parser.json():用于解析 application/json 类型的请求体,将其解析为 JavaScript 对象。
    • Parser.urlencoded({ extended: true }):用于解析 URL 编码的表单数据,extended 选项为 true 时,支持更复杂的对象和数组解析。
    • Parser.json({limit:'5gb'}):限制请求体的大小为 5GB。
  • 下载
npm i body-parser -S

总结:

  • express:用来创建 Web 服务器和路由。
  • multer:用来处理文件上传。
  • fs:用于操作文件系统(如读取、写入文件)。
  • path:提供路径操作的工具,跨平台支持。
  • cors:用于处理跨域请求,允许不同域访问资源。
  • body-parser:解析 HTTP 请求体(JSON 或 URL 编码数据),并将其附加到 req.body 中。

三、示例代码

关于如何使用,在 Vue3使用多线程处理文件分片任务 中有介绍到,感兴趣的可以去看看。

javascript">const express = require('express');
const multer = require('multer');
const fs = require('fs');
const path = require('path');
const cors = require('cors')
const Parser = require("body-parser");// 创建 express 应用
const app = express();
const upload = multer({ dest: 'uploads/' });
// parse application/x-www-form-urlencoded
app.use(Parser.json({limit:'5gb'}));
app.use(Parser.urlencoded({limit:'5gb',extended:true}));
// parse application/json
app.use(Parser.json());
app.use(cors())// 接收分片
app.post("/upload-chunk", upload.single("file"), (req, res) => {const { chunkIndex, hash, fileName } = req.body; // 分片索引、哈希值、文件名const chunk = req.file; // 上传的分片文件const chunkDir = path.join(__dirname, "chunks", fileName); // 存储分片的目录if (!fs.existsSync(chunkDir)) fs.mkdirSync(chunkDir, { recursive: true });  //文件夹不存在则进行创建// chunkDir 命名时候需要注意,尽量进行标识以防文件名冲突const chunkPath = path.join(chunkDir, `${chunkIndex}-${hash}`); // 分片文件名加哈希fs.rename(chunk.path, chunkPath, (err) => {if (err) {console.error("存储分片失败:", err);return res.json({code:500, msg: "存储失败,请重新上传" });}res.json({ code:200, msg: ` ${chunkIndex} 上传成功` });});
});
// 合并文件
app.post("/merge-chunks", async (req, res) => {const { fileName, totalChunks } = req.body;const chunkDir = path.join(__dirname, "chunks", fileName);const targetPath = path.join(__dirname, "uploads", fileName); // 最终文件存储路径try {// 确保目标文件不存在if (fs.existsSync(targetPath)) {fs.unlinkSync(targetPath);}const writeStream = fs.createWriteStream(targetPath);for (let i = 0; i < totalChunks; i++) {const chunkFiles = fs.readdirSync(chunkDir).filter((file) => file.startsWith(`${i}-`));if (chunkFiles.length === 0) {res.json({code:500, msg: "上传失败,请重新上传" });throw new Error(`分片缺失: ${i}`);}// 读取分片内容const chunkPath = path.join(chunkDir, chunkFiles[0]);const data = fs.readFileSync(chunkPath);writeStream.write(data);// 删除已合并分片fs.unlinkSync(chunkPath);}writeStream.end();// 删除分片目录fs.rmdirSync(chunkDir);res.json({ code:200, msg: "文件上传成功", path: '/uploads/' + fileName });} catch (err) {console.error("合并文件失败:", err);res.json({code:500, msg: "文件合并失败" });}
});// 启动服务器
const PORT = 3000;
app.listen(PORT, '0.0.0.0', () => {console.log(`Server started on http://localhost:${PORT}`);
})

http://www.ppmy.cn/devtools/152543.html

相关文章

KubeSphere部署安装,接入KubeKey安装的k8s集群

KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…

线上商城拼团功能搭建指南

规划与设计 明确拼团模式&#xff1a;确定是常规的多人拼团、团长免单、阶梯拼团还是其他创新模式。比如常规拼团可设定 3 人或 5 人成团&#xff0c;团长免单模式则需规定团长的角色和权益等。确定功能需求&#xff1a;包括拼团活动创建、展示、参与、支付、成团通知、售后处理…

C++17 新的求值顺序规则:小白友好版指南

嘿&#xff0c;C 小白们&#xff01;今天&#xff0c;我们要聊一个听起来有点枯燥&#xff0c;但实际上超重要的话题——C17 中的求值顺序规则。别急&#xff0c;我会用最通俗易懂的方式&#xff0c;带你一步步搞懂这个知识点&#xff0c;让你在编程路上少走弯路&#xff0c;写…

Redis使用基础

1 redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务 ! 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并…

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…

python麻辣香锅菜品推荐

1.推荐算法概述 推荐算法出现得很早,最早的推荐系统是卡耐基梅隆大学推出的Web Watcher浏览器导航系统&#xff0c;可以根据当的搜索目标和用户信息,突出显示对用户有用的超链接。斯坦福大学则推出了个性化推荐系统LIRA.AT&T实验室于1997年提出基于协作过滤的个性化推荐系统…

Vue2.0的安装

1.首先查看是否已经安装了node.js 选择以管理员方式打开命令提示符&#xff08;权限较高&#xff09;&#xff0c;或者通过cmd的方式打开 打开后输入node -v 查看自己电脑是否安装node&#xff0c;以及版本号 node -v 如果没有的话&#xff0c;请查看Node.js的安装 2.Vue和脚…

【面试题】JVM部分[2025/1/13 ~ 2025/1/19]

JVM部分[2025/1/13 ~ 2025/1/19] 1. JVM 由哪些部分组成&#xff1f;2. Java 的类加载过程是怎样的&#xff1f;3. 请你介绍下 JVM 内存模型&#xff0c;分为哪些区域&#xff1f;各区域的作用是什么&#xff1f;4. JVM 垃圾回收调优的主要目标是什么&#xff1f;5. 如何对 Jav…