此文檔于2016年10月3日翻譯時multer的版本是1.2.0,它可能不是最新的杀糯!?甚至可能存在翻譯錯誤掉奄!你可能需要閱讀原版英語README?此文檔僅供參考箱歧!
Multer???
Multer 是一個 node.js 中間件剧罩,用于處理?multipart/form-data?類型的表單數(shù)據(jù)栓拜,它主要用于上傳文件。它是寫在?busboy?之上非常高效惠昔。
注意: Multer 不會處理任何非?multipart/form-data?類型的表單數(shù)據(jù)幕与。
$ npm install --save multer
Multer 會添加一個?body?對象 以及?file?或?files?對象 到 express 的?request?對象中。?body?對象包含表單的文本域信息镇防,file?或?files?對象包含對象表單上傳的文件信息啦鸣。
基本使用方法:
varexpress=require('express')varmulter=require('multer')varupload=multer({ dest:'uploads/'})varapp=express()app.post('/profile',upload.single('avatar'),function(req,res,next) {//req.file 是 `avatar` 文件的信息//req.body 將具有文本域數(shù)據(jù),如果存在的話})app.post('/photos/upload',upload.array('photos',12),function(req,res,next) {//req.files 是 `photos` 文件數(shù)組的信息//req.body 將具有文本域數(shù)據(jù)来氧,如果存在的話})varcpUpload=upload.fields([{ name:'avatar', maxCount:1}, { name:'gallery', maxCount:8}])app.post('/cool-profile', cpUpload,function(req,res,next) {//req.files 是一個對象 (String -> Array) 鍵是文件名诫给,值是文件數(shù)組////例如://req.files['avatar'][0] -> File//req.files['gallery'] -> Array////req.body 將具有文本域數(shù)據(jù),如果存在的話})
如果你需要處理一個只有文本域的表單饲漾,你可以使用任何一個 multer 方法 (.single(),?.array(),?fields()). 下面是一個使用?.array()?的例子:
varexpress=require('express')varapp=express()varmulter=require('multer')varupload=multer()app.post('/profile',upload.array(),function(req,res,next) {//req.body 包含文本域})
每個文件具有下面的信息:
KeyDescriptionNote
fieldnameField name 由表單指定
originalname用戶計算機上的文件的名稱
encoding文件編碼
mimetype文件的 MIME 類型
size文件大序Α(字節(jié)單位)
destination保存路徑DiskStorage
filename保存在?destination?中的文件名DiskStorage
path已上傳文件的完整路徑DiskStorage
buffer一個存放了整個文件的?BufferMemoryStorage
Multer 接受一個 options 對象缕溉,其中最基本的是?dest?屬性考传,這將告訴 Multer 將上傳文件保存在哪。如果你省略 options 對象证鸥,這些文件將保存在內(nèi)存中僚楞,永遠不會寫入磁盤。
為了避免命名沖突枉层,Multer 會修改上傳的文件名泉褐。這個重命名功能可以根據(jù)您的需要定制。
以下是可以傳遞給 Multer 的選項鸟蜡。
KeyDescription
dest?or?storage在哪里存儲文件
fileFilter文件過濾器膜赃,控制哪些文件可以被接受
limits限制上傳的數(shù)據(jù)
preservePath保存包含文件名的完整文件路徑
通常,只需要設(shè)置?dest?屬性 像這樣:
varupload=multer({ dest:'uploads/'})
如果你想在上傳時進行更多的控制揉忘,你可以使用?storage?選項替代?dest跳座。Multer 具有?DiskStorage?和?MemoryStorage?兩個存儲引擎;另外還可以從第三方獲得更多可用的引擎泣矛。
接受一個以?fieldname?命名的文件疲眷。這個文件的信息保存在?req.file。
接受一個以?fieldname?命名的文件數(shù)組您朽】袼浚可以配置?maxCount?來限制上傳的最大數(shù)量。這些文件的信息保存在?req.files。
接受指定?fields?的混合文件几颜。這些文件的信息保存在?req.files倍试。
fields?應該是一個對象數(shù)組,應該具有?name?和可選的?maxCount?屬性菠剩。
Example:
[? { name:'avatar', maxCount:1},? { name:'gallery', maxCount:8}]
只接受文本域易猫。如果任何文件上傳到這個模式,將發(fā)生 "LIMIT_UNEXPECTED_FILE" 錯誤具壮。這和?upload.fields([])?的效果一樣准颓。
接受一切。文件數(shù)組將保存在?req.files棺妓。
警告:?確保你總是處理了用戶的文件上傳攘已。 永遠不要將 multer 作為全局中間件使用,因為惡意用戶可以上傳文件到一個你沒有預料到的路由怜跑,應該只在你需要處理上傳文件的路由上使用样勃。
磁盤存儲引擎可以讓你控制文件的存儲。
varstorage=multer.diskStorage({destination:function(req,file,cb) {cb(null,'/tmp/my-uploads')? },filename:function(req,file,cb) {cb(null,file.fieldname+'-'+Date.now())? }})varupload=multer({ storage:storage })
有兩個選項可用性芬,destination?和?filename峡眶。他們都是用來確定文件存儲位置的函數(shù)。
destination?是用來確定上傳的文件應該存儲在哪個文件夾中植锉。也可以提供一個?string?(例如?'/tmp/uploads')辫樱。如果沒有設(shè)置?destination,則使用操作默認的臨時文件夾
注意:?如果你提供的?destination?是一個函數(shù)俊庇,你需要負責創(chuàng)建文件夾狮暑。當提供一個字符串,multer 將確保這個文件夾是你創(chuàng)建的辉饱。
filename?用于確定文件夾中的文件名的確定搬男。 如果沒有設(shè)置?filename,每個文件將設(shè)置為一個隨機文件名彭沼,并且是沒有擴展名的
注意:?Multer 不會為你添加任何擴展名缔逛,你的程序應該返回一個完整的文件名。
每個函數(shù)都傳遞了兩個請求 (req) 和一些關(guān)于這個文件的信息 (file) 有助于你的決定姓惑。
注意?req.body?可能還沒有完全填充褐奴,這取決于向客戶端發(fā)送字段和文件到服務器的順序。
內(nèi)存存儲引擎將文件存儲在內(nèi)存中的?Buffer?對象挺益,它沒有任何選項
varstorage=multer.memoryStorage()varupload=multer({ storage:storage })
當使用內(nèi)存存儲引擎歉糜,文件信息將包含一個?buffer?字段,里面包含了整個文件數(shù)據(jù)望众。
警告: 當你使用內(nèi)存存儲匪补,上傳非常大的文件伞辛,或者非常多的小文件,會導致你的應用程序內(nèi)存溢出
一個對象夯缺,指定一些數(shù)據(jù)大小的限制蚤氏。Multer 通過這個對象使用 busboy,詳細的特性可以在?busboy's page?找到踊兜。
可以使用下面這些:
KeyDescriptionDefault
fieldNameSizefield 名字最大長度100 bytes
fieldSizefield 值的最大長度1MB
fields非文件 field 的最大數(shù)量無限
fileSize在 multipart 表單中竿滨,文件最大長度 (字節(jié)單位)無限
files在 multipart 表單中,文件最大數(shù)量無限
parts在 multipart 表單中捏境,part 傳輸?shù)淖畲髷?shù)量(fields + files)無限
headerPairs在 multipart 表單中于游,鍵值對最大組數(shù)2000
設(shè)置 limits 可以幫助保護你的站點免受拒絕服務 (DoS) 攻擊。
設(shè)置一個函數(shù)來控制什么文件可以上傳以及什么文件應該跳過垫言,這個函數(shù)應該看起來像這樣:
functionfileFilter(req,file,cb) {//這個函數(shù)應該調(diào)用 `cb` 用boolean值來//指示是否應接受該文件//拒絕這個文件贰剥,使用`false`,像這樣:cb(null,false)//接受這個文件筷频,使用`true`蚌成,像這樣:cb(null,true)//如果有問題,你可以總是這樣發(fā)送一個錯誤:cb(newError('I don\'t have a clue!'))}
當遇到一個錯誤凛捏,multer 將會把錯誤發(fā)送給 express担忧。你可以使用一個比較好的錯誤展示頁 (express標準方式)。
如果你想捕捉 multer 發(fā)出的錯誤坯癣,你可以自己調(diào)用中間件程序瓶盛。
varupload=multer().single('avatar')app.post('/profile',function(req,res) {upload(req, res,function(err) {if(err) {//發(fā)生錯誤return}//一切都好})})
如果你想要構(gòu)建自己的存儲引擎,請看?這里?
文章來自:github