❤Nodejs 第十四章(node中间件multer的认识安装使用)

简介: 【4月更文挑战第14天】Multer是Node.js用于处理multipart/form-data的中间件,专注于文件上传。。基本用法包括设置存储引擎,如磁盘存储(DiskStorage)或内存存储(MemoryStorage),并指定处理单个或多个文件的方法。例如,`multer.single('file')`处理单个文件上传。存储引擎DiskStorage适合永久保存,而MemoryStorage适合临时处理。可以通过`limits`选项限制文件大小,实现不同类型的文件有不同的大小限制。

❤Nodejs 第十四章(node中间件multer的认识安装使用)

1、multer简介

官网地址
https://www.npmjs.com/package/multer

简介
multer 是一个Node.js中间件,用于处理multipart/form-data类型的数据,主要用于上传文件。它是专门设计来处理文件上传的,非常适合用在像图片上传这样的场景中

需要注意的是:

multer 不会处理任何非 multipart/form-data 类型的表单数据,就是没办法处理base64位的数据

换一句换说:前端必须这样设置类型 'Content-type': 'multipart/form-data'

guthub官方解释链接 https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md

2、安装

yarn add --save multer

3、引入multer和路径path

// 引入文件上传的包 Node.js中间件,用于处理multipart/form-data类型的数据
import multer from 'multer'
import path from 'path'

4、使用

方法和属性

1. multer() 构造函数

-   使用 `multer()` 构造函数来创建一个 `multer` 实例,用于处理文件上传。你可以通过传递配置选项来定制文件上传的行为,比如指定上传文件的存储目录等。

1. 常用配置选项

-   `dest`: 指定上传文件的存储目录。
-   `fileFilter`: 定义一个函数,用于过滤上传的文件。
-   `limits`: 设置上传文件的大小限制等。

1. 主要方法

-   **`single(fieldname)`** : 处理上传的单个文件。`fieldname` 是表单字段的名称,用于指定要处理的文件。
-   **`array(fieldname[, maxCount])`** : 处理上传的多个文件,可选参数 `maxCount` 用于指定最大上传文件数量。
-   **`fields(fields)`** : 处理上传的多个文件,每个文件可能属于不同的表单字段。
-   **`none()`** : 不处理文件上传,用于仅处理表单文本字段。

multer简单应用于上传文件存储的目的地文件夹

const upload = multer({
   dest: 'uploads/'}); // 上传

在Node接口之中使用这个multer 实例,创建了 multer 实例后,upload 变量可用于作为中间件在路由中处理文件上传

app.post('/upload', upload.single('file'), (req, res) => {
   
    res.send('File uploaded successfully!');
});

5、multer 之中 storage存储引擎的使用

multer 提供了两种存储引擎:

  1. DiskStorage:将上传的文件保存到磁盘上的特定位置。
  2. MemoryStorage:将上传的文件保存在内存中,作为 Buffer 对象。这通常用于临时文件或当你需要对文件进行处理然后再决定是否保存到磁盘上。

使用 DiskStorage

DiskStorage 允许你控制文件的存储路径和文件名。这是通过使用 destinationfilename 函数来实现的,这两个函数都可以根据请求和文件的详细信息动态地定义。

const multer = require('multer');

// 配置 DiskStorage
const storage = multer.diskStorage({
   
    destination: function (req, file, cb) {
   
        // 设置文件存储位置
        cb(null, 'uploads/')
    },
    filename: function (req, file, cb) {
   
        // 设置文件名
        const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
        cb(null, file.fieldname + '-' + uniqueSuffix)
    }
});

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

// 在路由中使用
app.post('/upload', upload.single('file'), (req, res) => {
   
    res.send('File uploaded successfully!');
});

使用 MemoryStorage

使用 MemoryStorage时,上传的文件不会写入磁盘,而是存储在内存中。对于需要处理文件数据(如解析、转换)然后可能再保存到数据库或其他存储系统的场景非常有用

const multer = require('multer');

// 配置 MemoryStorage
const storage = multer.memoryStorage();

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

// 在路由中使用
app.post('/upload', upload.single('file'), (req, res) => {
   
    // 可以从 req.file.buffer 访问文件数据
    res.send('File uploaded and processed!');
});

选择存储方式(选择哪种存储方式取决于我们实际的应用需求)

适当的存储引擎可以优化应用的性能和资源使用,确保上传的文件按照预期方式处理和存储。

  • 需要永久保存文件,或者对文件的物理位置有特定要求,使用 DiskStorage
  • 需要处理文件数据,然后决定是否保存或如何保存,使用 MemoryStorage

6、使用DiskStorage实现的方案

// 设置存储引擎
const storage = multer.diskStorage({
   
    destination: (req, file, cb) => {
   
        // cb(null, 'uploads/');
        // 获取当前日期
        const date = new Date();
        const year = date.getFullYear();
        const month = (date.getMonth() + 1).toString().padStart(2, '0');
        const day = date.getDate().toString().padStart(2, '0');
        const dateString = `${
     year}-${
     month}-${
     day}`;

        // 设置文件存储路径
        let destination;
        if (file.mimetype.startsWith('image/')) {
   
            destination = `uploads/${
     dateString}/img`;
        } else {
   
            destination = `uploads/${
     dateString}/file`;
        }
         // 判断目录是否存在,不存在则创建
        fs.access(destination, (error) => {
   
            console.log('文件存储判断');
            if (error) {
   
                fs.mkdirSync(destination, {
    recursive: true });
            }
            cb(null, destination);
        });

        // 创建文件夹
        // fs.mkdirSync(destination, { recursive: true });

        cb(null, destination);
    },
    filename: (req, file, cb) => {
   
        // 设置文件名为原始文件名
        // cb(null, file.originalname);
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

使用

// 配置Multer
const upload = multer({
    
    storage: storage,
    limits: {
    fileSize: 10 * 1024 * 1024 },
});

7、(优化)使用multer上传文件时根据文件类型限制传送的文件大小

使用 Multer 的 limits 选项来限制不同类型文件的最大大小。

为图像和视频分别创建不同的上传实例,并在其中设置不同的大小限制实现对图像和视频文件大小的不同管理。

const express = require('express');
const multer = require('multer');

const app = express();

// 创建 Multer 实例
const imageUpload = multer({
   
    limits: {
   
        fileSize: 10 * 1024 * 1024, // 10MB 限制
    },
});

const videoUpload = multer({
   
    limits: {
   
        fileSize: 100 * 1024 * 1024, // 100MB 限制
    },
});

// 图像上传路由
app.post('/upload/image', imageUpload.single('image'), (req, res) => {
   
    res.send('Image uploaded successfully!');
});

// 视频上传路由
app.post('/upload/video', videoUpload.single('video'), (req, res) => {
   
    res.send('Video uploaded successfully!');
});

app.listen(3000, () => {
   
    console.log('Server is running on port 3000');
});
目录
相关文章
|
20小时前
|
JavaScript 中间件 API
中间件应用Express.js(Node.js)
我们定义了一个名为 `logger` 的中间件函数。它接受请求对象、响应对象以及下一个中间件函数作为参数。当接收到请求时,它会打印出请求的 HTTP 方法和 URL,然后调用 `next()` 函数来将控制权传递给下一个中间件或路由处理器。我们使用 `app.use()` 方法将 `logger` 中间件添加到了应用级别的中间件堆栈中,这意味着它将对所有请求生效。
8 3
|
8天前
|
JavaScript API 开发者
深入了解Node.js的文件系统:Node.js文件系统API的使用与探索
【4月更文挑战第30天】本文深入探讨了Node.js的文件系统API,介绍了如何引入`fs`模块进行文件操作。内容包括异步读取和写入文件、删除文件、创建目录以及使用文件流进行高效操作。此外,还提到了文件系统的监视功能,帮助开发者全面掌握在Node.js中处理文件和目录的方法。
|
8天前
|
开发框架 JavaScript 中间件
深入探索Node.js的Express框架:使用与中间件详解
【4月更文挑战第30天】本文深入探讨了Node.js的Express框架,介绍了其作为Web开发的强大工具,主要聚焦于基本使用和中间件。Express是基于Node.js的Web应用框架,用于构建高效的应用和API。文章详细讲解了如何安装Express,创建简单应用,以及中间件的工作原理和应用,包括中间件的顺序、错误处理和挂载位置。此外,还提到了使用第三方中间件扩展功能。理解Express基础和中间件对于开发高质量Web应用至关重要。
|
23天前
|
JavaScript 关系型数据库 MySQL
❤Nodejs 第二章(Node连接本地数据库)
【4月更文挑战第2天】本文介绍了如何使用Node.js连接本地MySQL数据库。首先,提到了在MySQL官网下载安装数据库和使用Navicat for MySQL进行数据库管理。接着,通过`yarn add mysql`在项目中安装数据库依赖。然后,创建`app.js`文件,设置数据库连接参数,并建立连接进行查询操作。遇到导入模块的错误后,修改导入方式为CommonJS语法。
40 1
|
2月前
|
JavaScript 前端开发 Serverless
函数计算新功能— 支持 Node.js 18 、Node.js 20 运行时
从2024年2月起,函数计算正式发布 Node.js 18 运行时和 Nodejs.20 运行时,函数计算2.0和函数计算3.0都支持新的运行时,目前新运行时处在公测状态,欢迎大家来体验。
477 0
|
3月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
81 0
|
4月前
|
JavaScript
Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
31 0
|
5月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
9月前
|
NoSQL Java Redis
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因:
|
9月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)