nodejs中的中间件--Multer

Multer是Node.js处理multipart/form-data数据格式的中间件,主要用于文件上传。它可以控制文件存储位置、限制文件大小并过滤上传文件。Multer提供多种方法如.single()、.array()和.fields()来处理不同数量和类型的文件。使用DiskStorage可以在磁盘上保存文件,而MemoryStorage将文件存储在内存中。同时,Multer支持自定义文件名和错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中间件Multer

Multer是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件。该中间件不处理multipart/form-data数据格式以外的任何形式的数据
Tips:multipart/form-data是用来指定传输数据的特殊类型的,主要就是我们上传的非文本的内容,比如图片或者mp3等等
* 安装方法

$ npm install --save multer
  • API

文件信息(file information):上传后的文件具有如下属性
fieldname: 上传文件标签在表单中的name
originalname:文件在用户电脑上的文件名
Encoding:该文件的编码
mimetype:该文件的Mime type
size:该文件的字节数
destination:该文件要保存的文件夹
filename:在保存的文件夹下的文件名
path:文件上传后保存的完整路径
buffer:完整文件的buffer

multer(opts)
multer可以传入一个可选参数,一般该参数为dest属性,规定上传文件存放的位置。如果该参数省略,上传的文件将一直保存在内存中,永远不会写进磁盘。
默认情况下,Multer将会重命名上传的文件,以免文件名的冲突。重命名的方法可以根据需要个性化编写。

下面的属性是Multer的可选参数
dest or storage: 上传的文件所存放的位置
fileFilter:过滤什么文件可以上传的方法
limits:限制上传文件的大小

在一般的软件开发中,一般只有dest是需要设定的,设定方法如下

var upload = multer({ dest: 'uploads/' })

如果想对上传的文件有更多的要求,可以使用storage参数。

var  multer=require('multer');
var storage = multer.diskStorage({

 //设置上传后文件路径
    destination: function (req, file, cb) {
        cb(null, './public/uploads')
   }, 
 //给上传文件重命名,获取添加后缀名
  filename: function (req, file, cb) {
      var fileFormat = (file.originalname).split(".");
      cb(null, file.fieldname + '-' + Date.now() + "." + fileFormat[fileFormat.length - 1]);
  }
 });  
 //添加配置文件到multer对象。
 var upload = multer({
      storage: storage
});

.single(fieldname)
该方法接收单个上传的文件 fieldname为上传文件所用的标签name属性。上传的文件信息存储在req.file中

.array(fieldname[, maxCount])
该方法可以接收多个文件,参数为所有的上传文件所用标签的name属性。如果文件数量超过maxCount所规定的最大数量,会报错。上传的文件存储在req.files中

.fields(fields)

该方法可以接收由fields指定的不同类型的文件。多个文件对象被保存在req.files中。fields是由name和maxCount属性组成的json对象数组。例如

[
  { name: 'avatar', maxCount: 1 },
  { name: 'gallery', maxCount: 8 }
]

.any()

允许接收导线传来的任何文件。文件将被存储在req.files中。

storage

DiskStorage:disk storage engine可以控制存储文件到磁盘的操作

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
})

var upload = multer({ storage: storage })

有两个可选参数:destination和filename。这是两个规定文件如何保存的方法。
destination用来规定上传的文件保存的文件夹。该参数也可以通过字符串形式给出(如’tmp/uploads’)

filename用来规定文件保存到相应文件夹后的文件名。如果filename未给定,上传的文件将会随机分配一个文件名,但是该文件没有扩展名
注意: Multer不会自动为文件添加扩展名,所有filename方法中需要返回带有文件扩展名的完整文件名

MemoryStorage
memory storage engine 将在内存中的文件存储为Buffer对象。

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })

当使用memory storage,文件信息(file infomation)将会有buffer属性,该属性保存着完整的文件
注意:当一次性或短时间内上传非常大的文件,或者上传非常多的文件时,可能会引起应用程序占满内存。

limit
通过如下可选参数定义上传文件的大小限制

关键词描述默认
fieldNameSizefield name的最大字节值100bytes
fieldSizefield的最大字节值1MB
fields非文件fields的最大数量Infinity
fileSize For multipart forms文件的最大字节Infinity
files For multipart formsfile fields 的最大数量Infinity
parts For multipart forms(fields + files) 的最大数量Infinity

fileFilter
设置该函数控制哪些文件可以上传、哪些文件跳过

function fileFilter (req, file, cb) {

  // The function should call `cb` with a boolean
  // to indicate if the file should be accepted

  // To reject this file pass `false`, like so:
  cb(null, false)

  // To accept the file pass `true`, like so:
  cb(null, true)

  // You can always pass an error if something goes wrong:
  cb(new Error('I don\'t have a clue!'))

}

Error handling
如果需要获取错误信息,可以通过中间件函数获取

app.post('/profile', function (req, res) {
  upload(req, res, function (err) {
    if (err) {
      // An error occurred when uploading
      return
    }

    // Everything went fine
  })
})
  • 基本用法

    var express = require('express');
    var multer  = require('multer');
    var upload = multer({ dest: 'uploads/' });//设置文件上传后的保存路径
    var app = express();
    app.post('/profile', upload.single('avatar'), function (req, res, next) {
    
    // req.body will hold the text fields, if there were any
    })
    
    app.post('/photos/upload', upload.array('photos', 12),      function (req, res, next) {
    
     // req.body will contain the text fields, if there were any
    })
    
      var cpUpload = upload.fields([{ name: 'avatar',     maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
     app.post('/cool-profile', cpUpload, function (req, res, next) {
     // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files
     //
    // e.g.
    //  req.files['avatar'][0] -> File
    //  req.files['gallery'] -> Array
    //
    // req.body will contain the text fields, if there were any
    })
    

参看文献:Multer

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值