当前位置: 首页 > news >正文

multer 依赖详解

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

一、安装

npm install multer

二、基本使用

const express = require("express");

const multer = require("multer");

const app = express();

// 配置 multer

const 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` 时)。

相关文章:

  • 建设监理工程师网站深圳seo关键词优化
  • 南京网站优化平台全球搜索大全
  • logo网站设计素材柳州今日头条新闻
  • 免费手机个人网站关键词的选取原则有
  • 做电子商务网站上海网络公司seo
  • 深圳最好的营销网站建设公司怎么在百度上做网站
  • USBCANFD接口卡介绍
  • MATLAB应用介绍
  • 前后端分离项目部署到云服务器、宝塔(前端vue、后端springboot)详细教程
  • 深入理解分布式系统中的关键概念:三阶段提交、补偿事务、消息队列与Saga事务模型及分布式ID生成方案
  • C#通过接口 继承接口的类 实现约束 对List内数据类型的值进行排序,可直接复制使用
  • 我通过AI编程完成了第一个实用程序
  • 如何选择消息队列
  • 【开源-线程池(Thread Pool)项目对比】
  • vue cli 与 vite的区别
  • 《当齐天大圣踏入3A游戏世界:黑神话·悟空的破壁传奇》:此文为AI自动生成
  • 【UCB CS 61B SP24】Lecture 16 - Data Structures 2: ADTs, BSTs学习笔记
  • MySQL 8.0 Enterprise Backup (MEB) 备份与恢复实践指南
  • 【Maui】自定义统一色彩样式
  • 【软考-架构】1.2、指令系统-存储系统-cache
  • SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
  • RabbitMQ 高级配置与优化:从入门到精通
  • Linux:同步
  • 说说JVM的底层原理(JAVA是如何运行的)?
  • powershell:报错npm : 无法加载文件 D:\develop\nodejs\npm.ps1,因为在此系统上禁止运行脚本
  • Metal学习笔记七:片元着色器