multer文件上傳-中文文檔

此文檔于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 包含文本域})

API

文件信息

每個文件具有下面的信息:

KeyDescriptionNote

fieldnameField name 由表單指定

originalname用戶計算機上的文件的名稱

encoding文件編碼

mimetype文件的 MIME 類型

size文件大序Α(字節(jié)單位)

destination保存路徑DiskStorage

filename保存在?destination?中的文件名DiskStorage

path已上傳文件的完整路徑DiskStorage

buffer一個存放了整個文件的?BufferMemoryStorage

multer(opts)

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?兩個存儲引擎;另外還可以從第三方獲得更多可用的引擎泣矛。

.single(fieldname)

接受一個以?fieldname?命名的文件疲眷。這個文件的信息保存在?req.file。

.array(fieldname[, maxCount])

接受一個以?fieldname?命名的文件數(shù)組您朽】袼浚可以配置?maxCount?來限制上傳的最大數(shù)量。這些文件的信息保存在?req.files。

.fields(fields)

接受指定?fields?的混合文件几颜。這些文件的信息保存在?req.files倍试。

fields?應該是一個對象數(shù)組,應該具有?name?和可選的?maxCount?屬性菠剩。

Example:

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

.none()

只接受文本域易猫。如果任何文件上傳到這個模式,將發(fā)生 "LIMIT_UNEXPECTED_FILE" 錯誤具壮。這和?upload.fields([])?的效果一樣准颓。

.any()

接受一切。文件數(shù)組將保存在?req.files棺妓。

警告:?確保你總是處理了用戶的文件上傳攘已。 永遠不要將 multer 作為全局中間件使用,因為惡意用戶可以上傳文件到一個你沒有預料到的路由怜跑,應該只在你需要處理上傳文件的路由上使用样勃。

storage

DiskStorage

磁盤存儲引擎可以讓你控制文件的存儲。

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ā)送字段和文件到服務器的順序。

MemoryStorage

內(nèi)存存儲引擎將文件存儲在內(nèi)存中的?Buffer?對象挺益,它沒有任何選項

varstorage=multer.memoryStorage()varupload=multer({ storage:storage })

當使用內(nèi)存存儲引擎歉糜,文件信息將包含一個?buffer?字段,里面包含了整個文件數(shù)據(jù)望众。

警告: 當你使用內(nèi)存存儲匪补,上傳非常大的文件伞辛,或者非常多的小文件,會導致你的應用程序內(nèi)存溢出

limits

一個對象夯缺,指定一些數(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) 攻擊。

fileFilter

設(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坡锡,一起剝皮案震驚了整個濱河市蓬网,隨后出現(xiàn)的幾起案子窒所,更是在濱河造成了極大的恐慌鹉勒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吵取,死亡現(xiàn)場離奇詭異禽额,居然都是意外死亡,警方通過查閱死者的電腦和手機皮官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門脯倒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捺氢,你說我怎么就攤上這事藻丢。” “怎么了摄乒?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵悠反,是天一觀的道長残黑。 經(jīng)常有香客問我,道長斋否,這世上最難降的妖魔是什么梨水? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮茵臭,結(jié)果婚禮上疫诽,老公的妹妹穿的比我還像新娘。我一直安慰自己旦委,他們只是感情好奇徒,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缨硝,像睡著了一般逼龟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上追葡,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天腺律,我揣著相機與錄音,去河邊找鬼宜肉。 笑死匀钧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谬返。 我是一名探鬼主播之斯,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遣铝!你這毒婦竟也來了佑刷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤酿炸,失蹤者是張志新(化名)和其女友劉穎瘫絮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體填硕,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡麦萤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扁眯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壮莹。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姻檀,靈堂內(nèi)的尸體忽然破棺而出命满,到底是詐尸還是另有隱情,我是刑警寧澤绣版,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布胶台,位于F島的核電站狭莱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏概作。R本人自食惡果不足惜腋妙,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讯榕。 院中可真熱鬧骤素,春花似錦、人聲如沸愚屁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霎槐。三九已至送浊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丘跌,已是汗流浹背袭景。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闭树,地道東北人耸棒。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像报辱,于是被迫代替她去往敵國和親与殃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容