express文件上傳中間件Multer詳解

express文件上傳中間件Multer詳解

  轉載自:https://www.cnblogs.com/chengdabelief/p/6580874.htmlhtml

 

Express默認並不處理HTTP請求體中的數據,對於普通請求體(JSON、二進制、字符串)數據,可使用body-parser中間件。而文件上傳(multipart/form-data請求),能夠基於請求流處理,也可使用formidable模塊或Multer中間件。express

1. multer中間件npm

Multer是Express官方推出的,用於Node.jsmultipart/form-data請求數據處理的中間件。數組

它基於busboy構建,能夠高效的處理文件上傳,但並不處理multipart/form-data以外的用戶請求。app

2. 安裝

npm install multer --save
3. 使用函數

Multer在解析完請求體後,會向Request對象中添加一個body對象和一個file或files對象(上傳多個文件時使用files對象 )。其中,body對象中包含所提交表單中的文本字段(若是有),而file(或files)對象中包含經過表單上傳的文件。post

基本使用示例以下:ui

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.file 是 `avatar` 文件
// req.body 對象中是表單中提交的文本字段(若是有)
})
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
// req.files 是 `photos` 文件數組
// req.body 對象中是表單中提交的文本字段(若是有)
})
var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
// req.files 是一個對象 (String -> Array),文件的字段名是其 key,文件數組是 key的值
//
// 如:
// req.files['avatar'][0] -> File
// req.files['gallery'] -> Array
//
// req.body 對象中是表單中提交的文本字段(若是有)
})編碼

在使用中,若是僅須要處理multipart表單中的文本字段,可使用multer中的.single() 、 .array()或fields()方法。url

如,能夠像下面這樣使用.array()方法:

var express = require('express')
var app = express()
var multer = require('multer')
var upload = multer()
app.post('/profile', upload.array(), function (req, res, next) {
// req.body 中包含文本字段
})
4. multer的API
4.1 文件對象

multer解析完上傳文件後,會被保存爲一個包含如下字段的對象:

       fieldname - 表單提交的文件名(input控件的name屬性)
       originalname - 文件在用戶設備中的原始名稱
       encoding - 文件的編碼類型
       mimetype - 文件的Mime類型
       size - 文件的大小
       destination - 文件的保存目錄(DiskStorage)
       filename - 文件在destination中的名稱(DiskStorage)
       path - 上傳文件的全路徑(DiskStorage)

       buffer - 文件對象的Buffer(MemoryStorage)

4.2 方法

multer(opts) - 建立對象

引用multer模塊後,咱們會獲取到一個頂級方法。該方法是一個工廠函數,可使用這個方法建立Multer對象。它接受一個選項對象,最基本的選項是dest,它告訴 Multer 文件的存儲位置。若是忽略該選項,文件會被保存在內存中,而且永遠不會寫入硬盤中。

默認狀況下,Multer會對文件進行重命令,以免名稱衝突。重命名函數,能夠按須要自定義。

Multer的選項對象中能夠包含如下值:

       dest或storage - 文件存儲位置
       fileFilter - 函數,控制可上傳的文件類型
       limits - 上傳數據限制(文件大小)

在通常的Web應用中,只有dest選項須要設置。使用示例以下:

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

若是須要對上傳文件作更多控制,可使用storage代替dest,Multer會將存儲引擎由DiskStorage(硬盤存儲)切換爲MemoryStorage(內存存儲)。

建立multer對象後,咱們可使用如下實例來接收上傳文件:

.single(fieldname) - 單個文件上傳

接收一個名爲fieldname的上傳文件,所上傳的文件會被保存在req.file。

.array(fieldname[, maxCount]) - 多個文件上傳

接收名爲fieldname的,多個上傳文件數組。可選參數maxCount表示可接受的文件數量,上傳文件數超出該參數指定的數據後會拋出一個錯誤。文件數組會被保存在req.files中。

.fields(fields) - 多個文件上傳

接收經過fields指定的多個上傳文件。文件數組對象會被保存在req.files中。

fields是一個包含對象的數組,對象中會包含name和maxCount兩個屬性:

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

.none() - 僅解析文本字段

僅解析文本字段。若是請求中有任何上傳文件,會觸發'LIMIT_UNEXPECTED_FILE'錯誤。這個方法與upload.fields([])相似。

.any() - 接收全部文件

接收請求中的全部文件。上傳文件數組會被保存在req.files中。

4.3 選項參數

storage - 存儲引擎

該選項有如下兩個可選項:

       DiskStorage - 硬盤存儲
       MemoryStorage - 內存存儲

.diskStorage(obj)與硬盤存儲

硬盤存儲引擎提供了將文件存儲到磁盤的徹底控制:

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 })

.diskStorage()方法提供了文件存儲位置控制權限,該方法接收一個對象參數,其中包含兩destination和filename兩個屬性。

destination用於設置文件的存儲目錄,能夠是一個函數或字符串。若未提供該參數,將使用系統的臨時目錄。

filename用於設置文件名。若未提供該參數,將使用一個隨機字符串,且文件名中不包含擴展名。

.memoryStorage()與內存存儲

內存存儲引擎會以Buffer的形式將文件保存在內存中。該方法沒有任何參數:

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

limits - 文件尺寸

該選項用於設置文件尺寸,Multer 會將這個對象傳遞至busboy中。limits對象中能夠包含如下可選值:

       fieldNameSize - 字段名最大尺寸。默認值:100 bytes
       fieldSize - 字段值最大尺寸。默認值:1MB
       fields - 非文件字段的最大數量。默認值:Infinity
       fileSize - multipart 表單中,文件的最大尺寸。默認值:Infinity
       files - multipart 表單中,文件最大數量。默認值:Infinity
       parts - multipart 表單中,最大組件(fields+files)數量。默認值:Infinity

       headerPairs - 默認值:2000

fileFilter - 文件篩選

fileFilter用於控制要哪些文件是可接受的,哪些是要被拒絕的。使用形式以下:

function fileFilter (req, file, cb) {// 須要調用回調函數 `cb`,// 並在第二個參數中傳入一個布爾值,用於指示文件是否可接受// 若是要拒絕文件,上傳則傳入 `false`。如:cb(null, false)// 若是接受上傳文件,則傳入 `true`。如:cb(null, true)// 出錯後,能夠在第一個參數中傳入一個錯誤:cb(new Error('I don\'t have a clue!'))}

相關文章
相關標籤/搜索