multer 依赖详解

`multer` 是一个用于处理 `multipart/form-data` 类型表单数据的 Node.js 中间件,主要用于文件上传。它基于 `busboy` 构建,使用起来非常方便。

一、安装

npm install multer

二、基本使用

const express = require("express");const multer = require("multer");const app = express();// 配置 multerconst storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, "uploads/");},filename: function (req, file, cb) {cb(null, file.originalname);},});const upload = multer({ storage: storage });// 处理文件上传的路由app.post("/upload", upload.single("file"), (req, res) => {res.send("文件上传成功");});const port = 3000;app.listen(port, () => {console.log(`服务器运行在端口 ${port}`);});

三、配置选项

1. `storage`

`storage` 选项用于指定文件的存储方式,`multer` 提供了两种存储引擎:

1.1 `diskStorage`

将文件存储到磁盘上。你可以通过 `destination` 和 `filename` 函数来指定文件的存储目录和文件名。

const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, "uploads/"); // 指定存储目录},filename: function (req, file, cb) {cb(null, Date.now() + "-" + file.originalname); // 指定文件名},});

1.2 `memoryStorage`

将文件存储在内存中,以 `Buffer` 对象的形式存在。适用于需要对文件进行进一步处理(如上传到云存储)而不需要将文件保存到本地磁盘的场景。

const storage = multer.memoryStorage();const upload = multer({ storage: storage });

2. `limits`

`limits` 选项用于限制上传文件的大小、字段数量等。常见的限制选项包括:

`fileSize`:文件的最大大小(以字节为单位)。

`files`:允许上传的文件数量。

`fields`:允许的表单字段数量。

const upload = multer({storage: storage,limits: {fileSize: 1024 * 1024 * 5, // 限制文件大小为 5MB},});

3. `fileFilter`

`fileFilter` 选项用于过滤允许上传的文件类型。你可以通过回调函数来决定是否接受某个文件。

const fileFilter = function (req, file, cb) {// 只允许上传图片文件if (file.mimetype.startsWith("image/")) {cb(null, true);} else {cb(new Error("只允许上传图片文件"), false);}};const upload = multer({storage: storage,fileFilter: fileFilter,});

四、处理不同类型的文件上传

1. 单个文件上传

使用 `upload.single(fieldname)` 处理单个文件上传,其中 `fieldname` 是表单中文件字段的名称。

app.post("/upload", upload.single("file"), (req, res) => {// req.file 包含上传的文件信息console.log(req.file);res.send("文件上传成功");});

2. 多个文件上传(固定数量)

使用 `upload.array(fieldname, maxCount)` 处理多个文件上传,`maxCount` 是允许上传的最大文件数量。

app.post("/upload-multiple", upload.array("files", 3), (req, res) => {// req.files 是一个包含多个文件信息的数组console.log(req.files);res.send("多个文件上传成功");});

3. 多个文件上传(混合字段)

使用 `upload.fields(fields)` 处理包含多个文件字段的表单,`fields` 是一个包含每个字段名称和最大文件数量的数组。

app.post("/upload-mixed",upload.fields([{ name: "avatar", maxCount: 1 },{ name: "photos", maxCount: 3 },]),(req, res) => {// req.files 是一个对象,包含每个字段的文件信息console.log(req.files);res.send("混合文件上传成功");});

五、上传文件的信息

当文件上传成功后,`multer` 会将文件的相关信息添加到 `req.file`(单个文件上传)或 `req.files`(多个文件上传)中。常见的文件信息包括:

`fieldname`:表单中文件字段的名称。

`originalname`:文件的原始名称。

`encoding`:文件的编码类型。

`mimetype`:文件的 MIME 类型。

`size`:文件的大小(以字节为单位)。

`destination`:文件的存储目录(使用 `diskStorage` 时)。

`filename`:文件在存储目录中的名称(使用 `diskStorage` 时)。

`path`:文件的完整路径(使用 `diskStorage` 时)。

`buffer`:文件的二进制数据(使用 `memoryStorage` 时)。

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

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

相关文章

点云配准技术的演进与前沿探索:从传统算法到深度学习融合(4)

4、点云配准面临的挑战与应对策略 4.1 点云配准面临的主要挑战 在点云配准的实际应用中,尽管已经取得了显著的研究成果,但仍然面临着诸多复杂而严峻的挑战,这些挑战严重制约了点云配准技术在更多领域的广泛应用和深入发展。 在自动驾驶场景…

PostgreSQL10 物理流复制实战:构建高可用数据库架构!

背景 PostgreSQL 10 在高可用架构中提供了物理复制,也称为流复制(Streaming Replication),用于实现实例级别的数据同步。PostgreSQL 复制机制主要包括物理复制和逻辑复制:物理复制依赖 WAL 日志进行物理块级别的同步&…

⭐算法OJ⭐位操作实战【计数】(C++ 实现)

191. Number of 1 Bits Given a positive integer n, write a function that returns the number of set bits in its binary representation (also known as the Hamming weight). int hammingWeight(uint32_t n) {int count 0;while (n) {count n & 1; // 检查最低位…

从二维随机变量到多维随机变量

二维随机变量 设 X X X和 Y Y Y是定义在同一样本空间 Ω \varOmega Ω上的两个随机变量,称由它们组成的向量 ( X , Y ) (X, Y) (X,Y)为二维随机变量,亦称为二维随机向量,其中称 X X X和 Y Y Y是二维随机变量的分量。 采用多个随机变量去描述…

RabbitMQ系列(一)架构解析

RabbitMQ 架构解析 RabbitMQ 是一个基于 AMQP 协议的开源消息中间件,其核心架构通过多组件协作实现高效、可靠的消息传递。以下是其核心组件与协作流程的详细说明: 一、核心组件与功能 Broker(消息代理服务器) RabbitMQ 服务端核…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_list_init

ngx_list_init 定义在 src\core\ngx_list.h static ngx_inline ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size) {list->part.elts ngx_palloc(pool, n * size);if (list->part.elts NULL) {return NGX_ERROR;}list->par…

Linux切换Python版本

1、更新apt sudo apt update2、查询python安装路径 which python 或者which python33、查询安装版本 # 查看所有以 "python" 开头的命令(包括版本号) ls -l 安装路径* 例如 ls -l /usr/bin/python*4、修改软连接 udo unlink /usr/bin/pyt…

Spring Cloud之注册中心之Nacos的使用

目录 Naacos 服务注册/服务发现 引⼊Spring Cloud Alibaba依赖 引入Nacos依赖 引入Load Balance依赖 配置Nacos地址 服务端调用 启动服务 Naacos Nacos是Spring Cloud Alibaba的组件, Spring Cloud Alibaba遵循Spring Cloud中定义的服务注册, 服务发现规范. 因此使⽤Na…

使用通义万相Wan2.1进行视频生成

使用通义万相Wan2.1进行视频生成 源代码准备运行环境准备创建Python虚拟环境并激活安装依赖包 模型下载生成视频官网的视频生成例子简单描述场景视频生成示例详细描述场景视频生成示例 最近通义万相开源了其视频生成模型。模型有两个版本,一个是1.3B的,一…

鸿蒙HarmonyOS 开发简介

鸿蒙开发入门教程 一、技术简介 鸿蒙操作系统(HarmonyOS)是面向万物互联时代的全场景分布式操作系统,具备分布式软总线、分布式数据管理、分布式任务调度等核心能力,能让设备间实现无缝连接与协同,为用户提供统一、流…

docker和containerd从TLS harbor拉取镜像

私有镜像仓库配置了自签名证书,https访问,好处是不需要处理免费证书和付费证书带来的证书文件变更,证书文件变更后需要重启服务,自签名证书需要将一套客户端证书存放在/etc/docker/cert.d目录下,或者/etc/containerd/c…

linux ununtu通过nginx-1.6.2.tar.gz安装nginx并安装在自定义目录XXX下 的步骤

Ubuntu 下通过源码安装 Nginx 1.6.2 到自定义目录 /home/aot/nginx 的步骤 以下是将 Nginx 1.6.2 源码包离线安装到自定义目录的详细流程,包含依赖管理、编译配置和服务管理: 一、准备工作 1. 下载源码包和依赖(需联网环境准备)…

C++ 变量的输入输出教程

一、变量的基本概念 在 C 中,变量是用于存储数据的命名内存位置。在使用变量之前,需要先声明它的类型和名称,这样编译器才能为其分配适当大小的内存空间。例如: int age; // 声明一个整型变量 age double salary; // 声明一个…

React底层常见的设计模式

在React中,常见的设计模式为开发者提供了结构化和可重用的解决方案,有助于提高代码的可维护性和可扩展性。以下是对React中几种常见设计模式的详细解析,并附上示例代码和注释: 1. 容器组件与展示组件模式(Container/P…

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)和CA(匀加速)

给出三维下的交互式多模型(IMM)matlab例程,模型使用匀速运动CV和匀加速运动CA,滤波使用EKF(扩展卡尔曼滤波) 文章目录 代码运行结果程序结构 代码讲解模型定义:轨迹生成:IMM核心流程…

物理内存组织与分配的核心概念

在 Linux 内核内存管理(尤其是 Buddy System 伙伴系统)中,node、zone、type 和 order 是描述物理内存组织与分配的核心概念。以下是它们的详细解释: 1. Node(NUMA 节点) 定义: 在 NUMA&#xf…

智科技赋能宠物关怀新时代

在科技日新月异的今天,智能宠物监控技术正悄然引领宠物护理领域的新变革。借助尖端的传感器技术、高清摄像头以及强大的数据分析能力,这些智能系统为宠物主人开辟了前所未有的宠物关怀途径,让爱与关怀跨越时空限制。 智能宠物监控系统的核心…

SOME/IP 教程知识点总结

总结关于SOME/IP的教程,首先通读整个文件,理解各个部分的内容。看起来这个教程从介绍开始,讲到了为什么在车辆中使用以太网,然后详细讲解了SOME/IP的概念、序列化、消息传递、服务发现(SOME/IP-SD)、发布/订阅机制以及支持情况。 首先,我需要确认每个章节的主要知识点。…

playbin之autoplug_factories源码剖析

一、autoplug_factories_cb /* Called when we must provide a list of factories to plug to pad with caps.* We first check if we have a sink that can handle the format and if we do, we* return NULL, to expose the pad. If we have no sink (or the sink does not…

58区间和+44开发商购买土地(前缀和)

58. 区间和(第九期模拟笔试) 题目描述 给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 输入描述 第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。…