Multer 文件上传中间件 和 Busboy表单解析

Multer

是一个node.js中间件,用于处理 multipart/form-data类型的表单数据,主要用于上传文件。处理 multipart/form-data 类型的表单数据

Multer是基于Busboy解析的文件参数信息,获取fileStream,并通过storage转存的file.stream.pipe(outStream) //file.stream即fileStream

Multer在解析完请求体后,会向Request对象中添加一个body对象和一个file或files对象(上传多个文件时使用files对象 )。其中,body对象中包含所提交表单中的文本字段(如果有),而file(或files)对象中包含通过表单上传的文件

multer(options).single(name)

上传单个文件内容,如一次只上传一张图片。name为上传文件时的参数字段名称。

multer(options).array(name[,maxCount])

适用于同一个字段,一次上传多个文件的情况,例如选择多张图片发送。接受一个以 name 命名的文件数组。可以指定 maxCount 来限制上传的最大数量。这些文件的信息保存在 req.files。

multer(options).fields(fields)

适用于上传多个字段的情况。接受指定 fields 的混合文件。这些文件的信息保存在 req.files。fields 是一个对象数组,具有 name 和可选的 maxCount 属性

multer(options).none()

接收只有文本域的表单,如果上传任何文件,会返回 “LIMIT_UNEXPECTED_FILE” 错误。

multer(options).any()

接收一切上传的文件。

Multer 接受一个 options 对象,其中最基本的是 dest/storage 属性,这将告诉 Multer 将上传文件保存在哪。如果省略 options 对象,这些文件将保存在内存中,永远不会写入磁盘。

1.dest:指定上传文件的存储路径。文件名默认为随机字符。如果想自定义文件名称,使用storage属性代替dest

2.storage:指定上传文件的存储路径和文件名称。

2-1.DiskStorage 磁盘存储引擎

磁盘存储引擎可以让你控制文件的存储。有两个属性,属性值都是函数。destination,指定文件存储的路径;filename,指定文件的存储名称。

multer({storage: multer.diskStorage({

        //设置存储路径

        destination:(req,file,cb)=>{

            console.log("destination:",file);//打印结果如下图

            cb(null,fullPath);

        },

        //设置存储的文件名

        filename:(req,file,cb)=>{

            console.log("filename:",file);//打印结果如下图

            //获取文件的扩展名

            let extname=path.extname(file.originalname);

            filename=file.fieldname+"-"+Date.now()+extname;

            cb(null,filename);

        }

    })

});

2-2.MemoryStorage 内存存储引擎

multer({storage: multer.memoryStorage()})

3.limits: 用来指定一些数据大小的限制等

        limits:{

         files:2, //最多上传2个文件

            fileSize:5120 //设置单个文件最大为 5kb

        }

4.fileFilter

fileFilter 为一个函数,用来控制什么文件可以上传以及什么文件应该跳过。

function fileFilter (req, file, cb) {

  // 通过调用cb,用boolean值来指示是否应接受该文件

  // 拒绝这个文件,使用`false`,像这样:

  cb(null, false)

  // 接受这个文件,使用`true`,像这样:

  cb(null, true)

  // 如果有问题,你可以总是这样发送一个错误:

  cb(new Error('I don\'t have a clue!'))

}

Busboy

用于解析传入的HTML表单数据的node.js模块。

let Busboy = require('busboy');

//通过请求头信息创建busboy对象  headers - 这些是传入请求的 HTTP 标头,由各个解析器使用 preservePath -  是否应保留请求中文件部分的文件名中的路径  limits - 对传入数据的各种限制

let busboy = new Busboy({ headers: req.headers });

//将流链接到busboy对象

req.pipe(busboy);

//此事件由找到的每个文件字段发出

busboy.on('file', function (filedname, file, filename, encoding, mimetype) {//(字段名,文件,文件名,传输编码,mime类型)

    //创建一个可写流

    let writeStream = fs.createWriteStream('./upload/' + filename);

    //监听data事件,接收传过来的文件,如果文件过大,此事件将会执行多次,此方法必须写在file方法里

    file.on('data', function (data) {

        writeStream.write(data);

    })

    //监听end事件,文件数据接收完毕,关闭这个可写流

    file.on('end', function (data) {

        writeStream.end();

    });

});

    //监听finish完成事件,完成后重定向到百度首页

    busboy.on('finish', function () {

        res.writeHead(303, { Connection: 'close', Location: 'http://www.baidu.com/' });

        res.end();

    });

});

//此事件由找到的每个新的非文件字段发出

busboy.on('field', (name, val, info) => {

      console.log(`Field [${name}]: value: %j`, val);

    });

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

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

相关文章

Unity + 雷达 粒子互动(待更新)

效果预览: 花海(带移动方向) VFX 实例 脚本示例 使用TouchScript,计算玩家是否移动,且计算移动方向 using System.Collections; using System.Collections.Generic; using TouchScript; using TouchScript.Pointers; using UnityEngine; using UnityEngine.VFX;public …

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试6月1日预测第8弹

今天继续基于8883的大底,使用尽可能少的条件进行缩号。好了,直接上结果吧~ 首先,888定位如下: 百位:6,5,4,7,8,9,1,0 十位:7,8,6,5,9,3,1,0 个位:5,7,6,4,2,…

看广告赚金币提现小游戏app开发源码

开发一个看广告赚金币并可以提现的小游戏APP,源码的搭建涉及到多个方面,包括前端界面设计、后端逻辑处理、数据库管理以及广告平台的对接等。以下是一些建议的步骤和考虑因素: 前端界面设计: 使用HTML5、CSS3和JavaScript等技术…

第十三届蓝桥杯B组c++国赛

A - 2022: 题目: 笔记: 一道经典的dp题: (1)明确dp数组含义: dp[i][j][k]: 表示前i个数字中选择j个凑成k的方法数。 (2)确定状态转移方程: dp[i][j][k…

C++中的引用和解引用,及在Lambda中的简单使用

目录 摘要 引用(Reference) 定义 用法 解引用(Dereference) 定义 用法 Lambda表达式结合引用和解引用 引用结合Lambda表达式 解引用结合Lambda表达式 较为复杂的使用 总结 摘要 在C中,引用(Re…

linux 内核哪种锁可以递归调用 ?

当数据被多线程并发访问(读/写)时,需要对数据加锁。linux 内核中常用的锁有两类:自旋锁和互斥体。在使用锁的时候,最常见的 bug 是死锁问题,死锁问题很多时候比较难定位,并且影响较大。本文先会介绍两种引起死锁的原因…

Java-----String类

1.String类的重要性 经过了C语言的学习,我们认识了字符串,但在C语言中,我们表示字符串进行操作的话需要通过字符指针或者字符数组,可以使用标准库中提供的一系列方法对字符串的内容进行操作,但这种表达和操作数据的方…

沟通程序化(1):跟着鬼谷子学沟通—“飞箝”之术

沟通的基础需要倾听,但如果对方听不进你的话,即便你说的再有道理,对方也很难入心。让我们看看鬼谷子的“飞箝”之术能给我们带来什么样的启发吧! “飞箝”之术,源自中国古代兵法家、纵横家鼻祖鬼谷子的智慧&#xff0…

SpringBootWeb 篇-深入了解 Spring 异常处理、事务管理和配置文件参数配置化、yml 配置文件

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 配置文件 1.1 yml 配置文件 1.2 参数配置化 1.2.1 使用 Value 注解注入单个配置参数 1.2.2 使用 ConfigurationProperties 注解将一组相关配置参数注入到一个类中…

discuz论坛怎么修改备案信息

大家好,今天给大家分享下discuz如何填写备案信息并且展示在网站首页。大家都知道国内网站都需要备案,不通过备案的网站上是没办法通过域名打开的。大家也可以通过搜索网创有方,或者直接点击网创有方 查看悬挂备案号后的效果。 首先大家可以看…

如何在CentOS中合理划分磁盘空间以优化系统性能

目录 前言 理想的分区方案 为什么需要单独分区 安全性 性能 管理和维护 稳定性和可靠性 升级和兼容性 结论 前言 在进行CentOS系统的安装和配置时,合理划分磁盘空间是确保系统性能、安全性和易于管理的关键步骤。本文将探讨如何根据系统的硬件配置和预期用途…

安全测试扫描利器-Burpsuite

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

vscode常用插件及插件安装方式

一、常用插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 说明:中文语言包扩展(简体) open in browser 说明:可以在默认浏览器或应用程序中打开当前文件 Auto Rename Tag 说明:自动重…

Linux 命令:awk

1. 写在前面 本文主要介绍 Linux “awk” 命令:“awk” 是另一个强大的文本处理工具,用于处理和操作结构化数据,如日志文件和命令输出。它可以根据需要为我们打印特定的列值。 公众号: 滑翔的纸飞机 2. awk 命令 我们能用 awk 做…

Android 控件保持宽高比得几种方式

文章目录 Android 控件保持宽高比得几种方式adjustViewBounds百分比布局ConstraintLayout自定义View Android 控件保持宽高比得几种方式 adjustViewBounds 仅适用于 ImageView&#xff0c;保持横竖比。 <ImageViewandroid:layout_width"match_parent"android:l…

动态规划(Dynamic-Programming)问题讲解

动态规划类问题 从已知子问题的解&#xff0c;推导出当前问题的解 推导过程可以表达为一个数学公式用一维或二维数组来保存之前的计算结果&#xff08;可以进一步降维优化&#xff09; 将当前问题 分解成子问题 &#xff0c;找出递归公式&#xff0c;分阶段进行求解 求解过程中…

vue3+ts封装一个button组件

创建一个新的Button组件文件 Button.vue&#xff1a; <template><button :class"buttonClass" :disabled"disabled" click"handleClick"><slot></slot><i v-if"icon" :class"icon"></i&g…

python 生成器yield

生成器 创建生成器的方式 生成器推导式yield关键字 生成器相关方法 for&#xff1a;循环遍历生成器中的每一个值next&#xff1a;获取生成器中的下一个值 生成器注意点 代码执行到yield会暂停&#xff0c;然后把结果返回出去&#xff0c;下次启动生成器会在暂停的位置继续执行…

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

第十五课,海龟画图:抬笔与落笔函数、画曲线函数

一&#xff0c;turtle.penup()和turtle.pendown()&#xff1a;抬起与落下画笔函数 当使用上节课学习的这个turtle.forward()&#xff1a;画笔前进函数时&#xff0c;画笔会朝着当前方向在画布上留下一条指定&#xff08;像素&#xff09;长度的直线&#xff0c;但你可能发现&a…