【Node】认识multer库

作者:你的人类朋友日期:2025/10/21

前言

在 Node.js 中处理文件上传是一个常见的需求,比如用户上传头像或文档。

那么,如何简单、安全地接收并保存这些文件呢?

本文说说 multer 的库,它可以帮助我们快速实现这一功能。

小问题:为什么使用 multer 而不是 Node.js 原生模块来处理文件上传。

🤔 补充知识:原生模块如何实现文件上传?

使用 Node.js 原生模块实现文件上传需要手动解析 multipart/form-data 格式的请求体,处理数据流并识别边界符。

然后逐个字段提取文件内容和元数据,最后通过 fs 模块将文件缓冲区写入磁盘,整个过程需要处理复杂的字节级操作和错误边界情况。

总之,比较麻烦!!

正文

什么是 Multer?

Multer 是一个 Node.js 中间件,专门用于处理 multipart/form-data 类型的表单数据(即文件上传)。

它基于 busboy 构建,可以高效地解析传入的请求,并将文件保存到服务器指定目录,同时提供对上传文件的元数据(如文件名、大小、类型)的访问。

🤔 补充知识: multipart/form-data 是啥类型?

multipart/form-data 是一种用于在 HTTP 请求中传输二进制数据(如文件)和文本数据混合内容的编码类型,它通过特定的边界分隔符将表单中的不同字段和数据分割成多个部分,每个部分可以独立设置内容类型和编码,使其能够同时高效传输文本字段和文件等二进制数据。

说人话,就是网页表单要同时上传"文字"和"文件"时用的格式。比如你填用户名(文字)又传头像(图片),浏览器就会把文字和图片打包成一个特殊包裹,里面用"分隔线"把不同内容隔开,服务器收到后知道哪里是文字、哪里是文件,分别处理。

Multer 用起来很简单:你只需配置文件存到哪、叫什么名,就能处理单个文件、多个文件甚至文字图片混传的情况,还能设置文件大小和类型限制,防止乱传文件。

基本用法

以下是一个基于 Express + js 的示例,演示如何使用 Multer 实现单文件上传:

  1. 安装 Multer
1npm install multer  
  1. 创建 Express 服务并配置 Multer
1const express = require('express')
2const multer = require('multer')
3const app = express()
4
5/* 存储配置开始 */
6// 配置磁盘存储,也就是文件上传到服务器的目录
7const storage = multer.diskStorage({
8    destination: (req, file, cb) => {
9        cb(null, 'uploads/') // 文件保存目录
10    },
11    filename: (req, file, cb) => {
12        // 自定义文件名:时间戳+原文件名
13        cb(null, Date.now() + '-' + file.originalname)
14    }
15})
16/* 存储配置结束 */
17
18const upload = multer({storage})
19
20/* 上传路由开始 */
21// 处理单文件上传(字段名为 'avatar')
22app.post('/upload', upload.single('avatar'), (req, res) => {
23    console.log(req.file) // 上传文件的信息
24    res.send('文件上传成功!')
25})
26/* 上传路由结束 */
27
28/* 服务启动开始 */
29app.listen(3000, () => {
30    console.log('服务运行在端口 3000')
31})
32/* 服务启动结束 */
33
  1. 运行测试
  2. POST 方法
  3. Bodyform-data
  4. key 那边输入 avatar,因为代码中写的是 upload.single('avatar'),然后同样在 key 的那边选择“file”,然后在 value 那边选择一个图片
  5. 点击发送,你会收到类似下面的结果,这就完成了 ✅️!!
1{
2    "fieldname": "avatar",
3    "originalname": "fufu.jpg",
4    "encoding": "7bit",
5    "mimetype": "image/jpeg",
6    "destination": "uploads/",
7    "filename": "1760977045699-fufu.jpg",
8    "path": "uploads\\1760977045699-fufu.jpg",
9    "size": 340363
10}
11

其他上传场景

  • 多文件上传
1app.post('/photos', upload.array('photos', 5), (req, res) => {  
2    console.log(req.files) // 文件数组  
3})  
  • 混合字段(文本+文件)
1app.post('/submit', upload.fields([{name: 'avatar'}, {name: 'gallery'}]), (req, res) => {  
2    console.log(req.files) // 文件分组信息  
3    console.log(req.body) // 文本字段  
4})  

最后

简单回顾下前言中的问题:

为什么选择 Multer 而不是 Node.js 原生模块?

因为原生模块(如 httpfs)需要手动解析复杂的 multipart 请求体,处理文件流和边界符,代码冗长且易出错。

Multer 做好了封装,开发者直接用 Multer 就可以了,省心方便。


【Node】认识multer库》 是转载文章,点击查看原文


相关推荐


ip rule 策略路由
疯狂吧小飞牛2025/10/20

原文地址:ip rule 策略路由 欢迎参观我的网站:无敌牛 – 技术/著作/典籍/分享等 ip rule 是 Linux 策略路由(Policy-based Routing, PBR) 的核心命令,用于控制内核在查找路由时使用哪张路由表。 一、ip rule 基本语法 ip rule [list|add|del] [selectors] [action] selectors:匹配条件(如源 IP、入接口等)action:匹配后执行的动作(最常见的是 table N,即使用路由表


【汽车篇】AI深度学习在汽车轮胎X-ray缺陷检测应用方案
Dongsheng_20192025/10/19

一、行业痛点 轮胎安全=生命安全 起鼓、胎侧凹陷、开裂、微孔、气泡等内部缺陷肉眼不可见,传统人工敲听+抽检: 漏检率 2%–5%,一旦流出即面临召回及高额索赔; 节拍慢,单胎平均 45 s,无法满足 70 JPH 下线节奏; 结果无数据留存,难以追溯工艺根因。 二、技术方案 东声智能“AI+X-ray”在线检测系统,将穿透成像与深度学习合二为一,为轮胎内部质量打造零缺陷防线。 1.缺陷定位算法: 3D 模块精准标定起鼓、凹陷、气泡等 12 类缺陷中心坐标。 2.双擎决策:传统算法分


苦练Python第67天:光速读取任意行,linecache模块解锁文件处理新姿势
倔强青铜三 VIP.1 初学乍练2025/10/17

前言 大家好,我是 倔强青铜三。欢迎关注我,微信公众号: 倔强青铜三。点赞、收藏、关注,一键三连! 今天咱们把 Python 自带的“光速行读取器”—— linecache 模块,从开箱到实战一次性讲透。 一、为什么需要 linecache? 秒级随意读任意行:再也不用 for i, line in enumerate(f) 数行号。 内存缓存机制:同一个文件多次读取,只加载一次。 源码级调试神器:traceback、pdb 都在用它。 零依赖:官方出品,随 Python 一起安装。 li


Redis(65)如何优化Redis的AOF持久化?
Victor3562025/10/16

优化 Redis 的 AOF(Append-Only File)持久化机制可以提高数据持久化的效率和性能,并且能够确保数据的安全性和一致性。以下是关于如何优化 Redis AOF 持久化的详细指南,包括操作配置、代码示例及具体步骤。 1. AOF 持久化配置 Redis 提供了多个配置参数来调整 AOF 的行为,主要包括: appendonly appendfsync auto-aof-rewrite-percentage auto-aof-rewrite-min-size aof-load-


C#/.NET/.NET Core技术前沿周刊 | 第 57 期(2025年10.1-10.12)
追逐时光者2025/10/14

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐或自荐优质文章、项目、学习资源等。 🏆技术前沿周刊Gitee开源地址: gitee.com/ysgdaydayup… 📰技术前沿周刊GitHub开源地址: github.com/YSGStudyHar… 👪DotNetGuid


优选算法-二分:19.搜索插入位置
CoderYanger2025/10/13

题目链接:35.搜索插入位置(简单) 算法思路: 二分:二分查找该元素 没找到就返回最后一次查找的左边界下标(即为插入位置) Java代码: /** * Created with IntelliJ IDEA. * Description: * User: 王洋 * Date: 2025-08-28 * Time: 09:24 */ class Solution { //35. 搜索插入位置 /*给定一个排序数组和一个目标值,在数组中找到目标值,


RabbitMQ核心机制
00后程序员张2025/10/11

MQ 概述 MQ,消息队列,一种在分布式系统中用于通信的关键组件 本质上是一个队列,遵循 FIFO(先入先出)原则,队列中存储的内容是消息(message) 消息可以非常简单,比如只包含文本字符串或 JSON 数据,也可以很复杂,如内嵌对象。MQ 主要用于分布式系统之间的通信,解决数据传递的效率和可靠性问题 1.2 系统间通信方式 在分布式系统中,系统之间的调用通常有两种方式: 1.同步通信: 直接调用对方的服务,数据从一端发出后立即到达另一端。这种方式响应快,但可能导致调用方阻塞,尤


还在纠结用v-if还是v-show?看完这篇彻底搞懂Vue渲染机制!
良山有风来2025/10/10

你是不是也曾经在写Vue时纠结过:这里到底该用v-if还是v-show? 或者更惨的是,明明代码逻辑没问题,列表渲染却总是出现各种诡异bug:删除一个项,结果删错了;切换数据,页面状态全乱了... 别担心,今天我就来帮你彻底搞懂Vue的条件渲染和列表渲染,让你写出更优雅、更高效的代码! v-if和v-show:看似相似,实则大不相同 先来看个最简单的例子: <!-- v-if 的用法 --> <div v-if="isVisible">我会在条件为真时渲染</div> <!-- v-show


JavaScript性能优化实战:从指标到落地的全链路方案
weixin_439647792025/10/8

JavaScript性能优化实战:从指标到落地的全链路方案 实际项目中,性能优化往往不是单一手段的应用,而是“指标监测-瓶颈定位-方案实施-效果验证”的全链路过程。本文将结合电商、管理系统等真实场景,提供可落地的性能优化闭环方案。 一、性能指标体系:从“感觉卡顿”到“数据说话” 性能优化的第一步是建立可量化的指标体系,避免凭主观感受判断优化效果。前端核心性能指标可分为三类: 1. 加载性能指标 LCP(最大内容绘制):衡量首屏加载速度,目标值<2.5sTTI(交互时间):页面可完全交互


Flutter 开发:应用颜色使用 Class 还是 Enum?—— 你应该选择哪一个?
JarvanMo2025/10/7

在开始一个新的 Flutter 项目时,第一步就是定义你的颜色调色板(color palette) 。一个一致且可维护的颜色系统不仅能保持你的设计简洁,还能让你的应用扩展变得更加容易。 但这里有一个开发者经常面临的常见问题: 👉 在 Flutter 中,你是应该使用带有静态常量的 Class(类) ,还是使用 **Enum(枚举)**来管理颜色呢? 随着 Dart 2.17 中**增强型枚举(enhanced enums)**的到来,答案变得更有趣了。下面我们通过示例、优缺点来探讨这两种方法。

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0