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

news2025/1/23 15:38:31

前言:上一篇文章讲了如何进行文件的分片: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

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

2. multer

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 (文件系统模块)

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

4. path

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

5. cors

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

6. body-parser

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使用多线程处理文件分片任务 中有介绍到,感兴趣的可以去看看。

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}`);
})

四、资源地址

csdn内地址:资源下载
gitee地址:chunk资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2025小年源码免费送】

&#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜&#xff0c; &#x1f525;码农福利等你领&#xff01; &#x1f496;山高路远坑又深&#xff0c; &#x1f4d5;大军纵横任驰奔&#xff0c; &#x1f389;谁敢横刀立马行…

【JavaSE】(8) String 类

一、String 类常用方法 1、构造方法 常用的这4种构造方法&#xff1a;直接法&#xff0c;或者传参字符串字面量、字符数组、字节数组。 在 JDK1.8 中&#xff0c;String 类的字符串实际存储在 char 数组中&#xff1a; String 类也重写了 toString 方法&#xff0c;所以可以直…

css普通用法

Css普通用法 这是一个链接 W3C&#xff0c;用这个语法可以访问W3C,自己可以去看更加详细的内容。 基本语法 名字{ 类型&#xff1a;参数 类型&#xff1a;参数 }a{ color:blue }引入方法 直接在html之中进行带入到html代码之中&#xff0c;文件不需要重新写一个&#xff0c…

大数据Hadoop中MapReduce的介绍包括编程模型、工作原理(MapReduce、MapTask、ReduceTask、Shuffle工作原理)

MapReduce概述 MapReduce是Hadoop的核心项目之一&#xff0c;它是一个分布式计算框架&#xff0c; 可用于大数据并行处理的计算模型、框架和平台&#xff0c;主要解决海量数据的计算&#xff0c;是大数据中较为熟知的分布式计算框架。 MapReduce作为分布式计算框架&#xff0…

【学习笔记】计算机网络(一)

第1章 概述 文章目录 第1章 概述1.1 计算机网络在信息时代中的作用1.2 互联网概述1.2.1 网络的网络1.2.2互联网基础结构发展的三个阶段1.2.3 互联网的标准化工作 1.3 互联网的组成1.3.1 互联网的边缘部分1.3.2 互联网的核心部分 1.4 计算机网络在我国的发展1.5 计算机网络的类别…

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念&#xff0c;实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 &#xff08;Deferred shading&#xff09;技术。 按照本文代码实现后&#xff0c;可以实现以下…

KubeSphere 开源社区 2024 年度回顾与致谢

随着 2024 年圆满落幕&#xff0c;我们回顾 KubeSphere 社区这一年走过的每一步&#xff0c;感慨万千。2024 年&#xff0c;KubeSphere 继续领跑云原生技术的创新与发展&#xff0c;推动开源文化的传播&#xff0c;致力于为全球开发者和企业用户提供更强大的平台和解决方案。感…

ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档

一、云电脑&#xff1a;电竞新宠崛起 在电竞游戏不断发展的今天&#xff0c;硬件性能成为了决定游戏体验的关键因素。为了追求极致的游戏画面与流畅度&#xff0c;玩家们往往需要投入大量资金购置高性能电脑。然而&#xff0c;云电脑技术的出现&#xff0c;为玩家们提供了一种…

GitCode 助力 AutoTable:共创 MyBatis 生态的自动表格管理新篇章

项目仓库https://gitcode.com/dromara/auto-table 解放双手&#xff0c;专注业务&#xff1a;MyBatis 生态的“自动表格”创新 AutoTable 是一款致力于为 MyBatis 生态赋予“自动表格”功能的创新插件。其核心理念是通过 Java 实体类自动生成和维护数据库的表结构&#xff0c…

【useLayoutEffect Hook】在浏览器完成布局和绘制之前执行副作用

目录 前言语法useLayoutEffect 对比 useEffect&#xff1a;示例 前言 useLayoutEffect 是 React 中的一个 Hook&#xff0c; 类似于 useEffect&#xff0c;但有一个关键的区别&#xff1a;它会在所有的 DOM 变更之后同步调用 effect。这意味着它可以读取 DOM 布局并同步重新渲…

vue3-sfc-loader 加载远程.vue文件(sfc)案例

注意事项 style标签如果增加了lang比如&#xff1a;lang“scss”&#xff0c;需要提供scss-loader的处理器&#xff0c;这个暂时没研究&#xff0c;我的处理方式是将动态模版的css放在了全局打包暂时还没有测试&#xff0c;后面测试了会同步更新 安装vue3-sfc-loader npm inst…

AIGC的企业级解决方案架构及成本效益分析

AIGC的企业级解决方案架构及成本效益分析 一,企业级解决方案架构 AIGC(人工智能生成内容)的企业级解决方案架构是一个多层次、多维度的复杂系统,旨在帮助企业实现智能化转型和业务创新。以下是总结的企业级AIGC解决方案架构的主要组成部分: 1. 技术架构 企业级AIGC解决方…

NSIS系统制作Windows下的简易的安装程序

一. 前言 NSIS&#xff08;Nullsoft Scriptable Install System&#xff09;是一个专业的开源系统&#xff0c;用于创建 Windows 安装程序。拥有小巧而灵活的特点&#xff0c;受到很多用户的赞赏。 NSIS 基于脚本语言&#xff0c;允许您创建逻辑来处理比较复杂的安装任务。 官…

leetcode-不同路径问题

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 看见题目…

前端开发中的模拟后端与MVVM架构实践[特殊字符][特殊字符][特殊字符]

平时&#xff0c;后端可能不能及时给接口给前端进行数据调用和读取。这时候&#xff0c;前端想到进行模拟后端接口。本文将介绍如何通过vite-plugin-mock插件模拟后端接口&#xff0c;并探讨MVVM架构在前端开发中的应用。此外&#xff0c;我们还将讨论Vue2与Vue3的区别&#xf…

【Tool】沉浸式翻译 DeepLX

效果对比 对比一下四个常用的翻译工具的效果 不难看出只有Deepl算是在讲人话 如何配置 DeepLX 安装沉浸式翻译插件 获取APIKEY 从这获取: https://linux.do/t/topic/111737 配置 参考官方教程: https://linux.do/t/topic/111911

登录认证(3):会话跟踪技术:Session

Session概览 上文提到了&#xff0c;为了在同一个会话中共享数据&#xff08;比如用户的登录状态&#xff09;&#xff0c;我们需要使用会话跟踪技术&#xff0c;Cookie是客户端的会话跟踪技术&#xff0c;是存储在本地浏览器中的。而本文介绍另外一种会话跟踪技术Session&…

2024年博客之星年度评选|第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南

2024年博客之星年度评选&#xff5c;第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南 2024年博客之星年度评选正在如火如荼地进行中&#xff01;作为博客圈最具影响力的评选活动之一&#xff0c;今年的评选吸引了众多优秀博主的参与。现在&#xff0c;距离Top300入…

ui文件转py程序的工具

源博客连接&#xff1a; PyCharm中利用外部工具uic转成的py文件&#xff0c;里面全是C代码&#xff0c;并非python类型的代码&#xff0c;导致大量报错。。。_pyside6-uic为什么把ui转为了c-CSDN博客 如果想把ui文件转为py文件&#xff0c;首先设置pycharm的外部工具&#xf…

【喜讯】海云安荣获“数字安全产业贡献奖”

近日&#xff0c;国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上&#xff0c;海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力&#xff0c;荣获了“数字安全产业贡献…