国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

express文件上傳中間件Multer詳解

2019-11-20 08:41:02
字體:
來源:轉載
供稿:網友

前言

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

1. multer中間件

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

它基于busboy構建,可以高效的處理文件上傳,但并不處理multipart/form-data之外的用戶請求。

2. 安裝

npm install multer --save

3. 使用

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

基本使用示例如下:

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()方法。

如,可以像下面這樣使用.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!'))}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高邮市| 临西县| 三江| 仁寿县| 内黄县| 海林市| 宜黄县| 保山市| 阿坝县| 恩施市| 水城县| 化州市| 金山区| 林西县| 马龙县| 鄂尔多斯市| 沾益县| 绥中县| 社旗县| 嘉祥县| 齐齐哈尔市| 沁水县| 城固县| 丹凤县| 松滋市| 班玛县| 马边| 大名县| 邹城市| 沂南县| 安西县| 武山县| 大余县| 武安市| 陈巴尔虎旗| 栾城县| 大名县| 丽水市| 吉首市| 彩票| 浦北县|