Node.js接收文件分片数据并进行合并处理
前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。
目录:
- 一、文件结构
- 二、主要依赖
- 1. `express`
- 2. `multer`
- 3. `fs` (文件系统模块)
- 4. `path`
- 5. `cors`
- 6. `body-parser`
- 总结:
- 三、示例代码
一、文件结构
- chunks:文件分片存储;
- node_modules:依赖;
- uploads:合并后的文件存储目录;
- 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}`);
})
相关文章:

Node.js接收文件分片数据并进行合并处理
前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录: 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…...
Lsky-Pro在线图片搭建教程(Docker部署方式)
Lsky Pro+ 是一个使用 PHP 语言,采用 Laravel 框架开发的一款 Web 图片管理程序,中文名:兰空图床。如果你需要一个在线图床程序,那么这个开源项目可以帮助到你,部署流程非常简单。本章教程记录如何部署Lsky-Pro。 一、拉取镜像 docker pull halcyonazure/lsky-pro-docke…...
“深入浅出”系列之算法篇:(2)openCV、openMV、openGL
OpenCV是一个的跨平台计算机视觉库,可以运行在Linux囚、Windows 和Mac OS操作系统上。它轻量级而且高效,由一系列 C函数和少量C类构成,同时也提供了Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenMV是一个开源,低成本&am…...

AI 新动态:技术突破与应用拓展
目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代,人工智能(AI)无疑是最具影响力的领域之一。AI 技…...

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)
目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合,它继承自IEnumerable但具有一些关键的区别,使得它在处理数据库查询时非常有用,普通集…...

【记录】Jenkins版本及JDK关系介绍的官网地址
Redhat Jenkins Packages...
vue3-json-viewer和vue-json-pretty插件使用,vue3 json数据美化展示
本文介绍vue3如何进行json数据pretty展示 1 vue3-json-viewer 1.1 安装 npm install vue3-json-viewer --save1.2 全局引入 在main.ts中引入,然后直接在组件中使用 import { createApp } from vue import App from ./App.vue import JsonViewer from "vue3…...

python转转商超书籍信息爬虫
1基本理论 1.1概念体系 网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等,可以按照我们设置的规则自动化爬取网络上的信息,这些规则被称为爬虫算法。是一种自动化程序,用于从互联网上抓取数据。爬虫通过模拟浏览器的行为,访问网页并…...
Spring Boot 中的 InitializingBean:Bean 初始化背后的故事
在 Spring Boot 应用中,Bean 的生命周期管理至关重要。InitializingBean 接口允许 Bean 在完成属性注入后执行自定义初始化逻辑。本文将深入探讨 InitializingBean 接口在 Spring Boot 中的应用,揭示其工作原理,并分享一些最佳实践࿰…...

微信小程序:实现单选,多选,通过变量控制单选/多选
一、实现单选功能 微信小程序提供了 radio 组件来实现单选功能。radio 组件需要配合 radio-group 使用。 1. WXML 代码 <radio-group bindchange"onRadioChange"><label wx:for"{{items}}" wx:key"id"><radio value"{{it…...
MOS怎样选型,步骤详解
一:选用N沟道还是P沟道 为设计选择正确器件的第一步是决定采用N沟道还是P沟道MOSFET。在典型的功率应用中,当一个MOSFET接地,而负载连接到干线电压上时,该MOSFET就构成了低压侧开关。在低压侧开关中,应采用N沟道M…...
CMake技术细节:解决未定义,提供参数
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
1688 满足跨境业务需求而提供的一组 API 接口
1688 跨境属性接口系列是 1688 开放平台为满足跨境业务需求而提供的一组 API 接口,其中最主要的是1688.item_get : 一:1688.item_get接口 接口功能:主要用于查询 1688 商品的跨境属性,为开发者和商家提供了获取商品跨境关键信息…...

物联网网关Web服务器--CGI开发实例BMI计算
本例子通一个计算体重指数的程序来演示Web服务器CGI开发。 硬件环境:飞腾派开发板(国产E2000处理器) 软件环境:飞腾派OS(Phytium Pi OS) 硬件平台参考另一篇博客:国产化ARM平台-飞腾派开发板…...

计算机网络 (51)鉴别
前言 计算机网络鉴别是信息安全领域中的一项关键技术,主要用于验证用户或信息的真实性,以及确保信息的完整性和来源的可靠性。 一、目的与重要性 鉴别的目的是验明用户或信息的正身,对实体声称的身份进行唯一识别,以便验证其访问请…...

【Docker】搭建一个功能强大的自托管虚拟浏览器 - n.eko
前言 本教程基于群晖的NAS设备DS423的docker功能进行搭建,DSM版本为 DSM 7.2.2-72806 Update 2。 n.eko 支持多种类型浏览器在其虚拟环境中运行,本次教程使用 Chromium 浏览器镜像进行演示,支持访问内网设备和公网地址。 简介 n.eko 是…...

论文笔记(六十二)Diffusion Reward Learning Rewards via Conditional Video Diffusion
Diffusion Reward Learning Rewards via Conditional Video Diffusion 文章概括摘要1 引言2 相关工作3 前言4 方法4.1 基于扩散模型的专家视频建模4.2 条件熵作为奖励4.3 训练细节 5 实验5.1 实验设置5.2 主要结果5.3 零样本奖励泛化5.4 真实机器人评估5.5 消融研究 6 结论 文章…...

探索 Stable-Diffusion-Webui-Forge:更快的AI图像生成体验
目录 简介🌟 主要特点📥 安装步骤1. 下载2. 配置环境和安装依赖3. 模型目录说明 🚀 运行 Stable-Diffusion-Webui-Forge1. 进入项目目录2. 运行项目3. 打开页面 🎨 使用体验常见问题📝 小结 简介 Stable-Diffusion-We…...

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

PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10
1.环境搭建 硬件环境:CANoe、待测设备(包含UDS诊断模块) 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...