Multer中文文檔


此文檔於2016年10月3日翻譯時multer的版本是1.2.0,它可能不是最新的! 甚至可能存在翻譯錯誤!你可能需要閱讀原版英語README 此文檔僅供參考!

Multer   

Multer 是一個 node.js 中間件,用於處理 multipart/form-data 類型的表單數據,它主要用於上傳文件。它是寫在 busboy 之上非常高效。

注意: Multer 不會處理任何非 multipart/form-data 類型的表單數據。

其它語言

安裝

$ npm install --save multer

使用

Multer 會添加一個 body 對象 以及 file 或 files 對象 到 express 的 request 對象中。 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) 鍵是文件名,值是文件數組
  //
  // 例如:
  //  req.files['avatar'][0] -> File
  //  req.files['gallery'] -> Array
  //
  // req.body 將具有文本域數據,如果存在的話
})

如果你需要處理一個只有文本域的表單,你應當使用 .none():

var express = require('express')
var app = express()
var multer  = require('multer')
var upload = multer()

app.post('/profile', upload.none(), function (req, res, next) {
  // req.body 包含文本域
})

API

文件信息

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

Key Description Note
fieldname Field name 由表單指定  
originalname 用戶計算機上的文件的名稱  
encoding 文件編碼  
mimetype 文件的 MIME 類型  
size 文件大小(字節單位)  
destination 保存路徑 DiskStorage
filename 保存在 destination 中的文件名 DiskStorage
path 已上傳文件的完整路徑 DiskStorage
buffer 一個存放了整個文件的 Buffer MemoryStorage

multer(opts)

Multer 接受一個 options 對象,其中最基本的是 dest 屬性,這將告訴 Multer 將上傳文件保存在哪。如果你省略 options 對象,這些文件將保存在內存中,永遠不會寫入磁盤。

為了避免命名沖突,Multer 會修改上傳的文件名。這個重命名功能可以根據您的需要定制。

以下是可以傳遞給 Multer 的選項。

Key Description
dest or storage 在哪里存儲文件
fileFilter 文件過濾器,控制哪些文件可以被接受
limits 限制上傳的數據
preservePath 保存包含文件名的完整文件路徑

通常,一般的網頁應用,只需要設置 dest 屬性,像這樣:

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

如果你想在上傳時進行更多的控制,你可以使用 storage 選項替代 dest。Multer 具有 DiskStorage 和 MemoryStorage 兩個存儲引擎;另外還可以從第三方獲得更多可用的引擎。

.single(fieldname)

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

.array(fieldname[, maxCount])

接受一個以 fieldname 命名的文件數組。可以配置 maxCount 來限制上傳的最大數量。這些文件的信息保存在 req.files

.fields(fields)

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

fields 應該是一個對象數組,應該具有 name 和可選的 maxCount 屬性。

Example:

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

.none()

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

.any()

接受一切上傳的文件。文件數組將保存在 req.files

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

storage

磁盤存儲引擎 (DiskStorage)

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

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 是用來確定上傳的文件應該存儲在哪個文件夾中。也可以提供一個 string (例如 '/tmp/uploads')。如果沒有設置 destination,則使用操作系統默認的臨時文件夾。

注意: 如果你提供的 destination 是一個函數,你需要負責創建文件夾。當提供一個字符串,multer 將確保這個文件夾是你創建的。

filename 用於確定文件夾中的文件名的確定。 如果沒有設置 filename,每個文件將設置為一個隨機文件名,並且是沒有擴展名的。

注意: Multer 不會為你添加任何擴展名,你的程序應該返回一個完整的文件名。

每個函數都傳遞了請求對象 (req) 和一些關於這個文件的信息 (file),有助於你的決定。

注意 req.body 可能還沒有完全填充,這取決於向客戶端發送字段和文件到服務器的順序。

內存存儲引擎 (MemoryStorage)

內存存儲引擎將文件存儲在內存中的 Buffer 對象,它沒有任何選項。

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

當使用內存存儲引擎,文件信息將包含一個 buffer 字段,里面包含了整個文件數據。

警告: 當你使用內存存儲,上傳非常大的文件,或者非常多的小文件,會導致你的應用程序內存溢出。

limits

一個對象,指定一些數據大小的限制。Multer 通過這個對象使用 busboy,詳細的特性可以在 busboy's page 找到。

可以使用下面這些:

Key Description Default
fieldNameSize field 名字最大長度 100 bytes
fieldSize field 值的最大長度 1MB
fields 非文件 field 的最大數量 無限
fileSize 在 multipart 表單中,文件最大長度 (字節單位) 無限
files 在 multipart 表單中,文件最大數量 無限
parts 在 multipart 表單中,part 傳輸的最大數量(fields + files) 無限
headerPairs 在 multipart 表單中,鍵值對最大組數 2000

設置 limits 可以幫助保護你的站點抵御拒絕服務 (DoS) 攻擊。

fileFilter

設置一個函數來控制什么文件可以上傳以及什么文件應該跳過,這個函數應該看起來像這樣:

function fileFilter (req, file, cb) {

  // 這個函數應該調用 `cb` 用boolean值來
  // 指示是否應接受該文件

  // 拒絕這個文件,使用`false`,像這樣:
  cb(null, false)

  // 接受這個文件,使用`true`,像這樣:
  cb(null, true)

  // 如果有問題,你可以總是這樣發送一個錯誤:
  cb(new Error('I don\'t have a clue!'))

}

錯誤處理機制

當遇到一個錯誤,multer 將會把錯誤發送給 express。你可以使用一個比較好的錯誤展示頁 (express標准方式)。

如果你想捕捉 multer 發出的錯誤,你可以自己調用中間件程序。如果你想捕捉 Multer 錯誤,你可以使用 multer 對象下的 MulterError 類 (即 err instanceof multer.MulterError)。

var multer = require('multer')
var upload = multer().single('avatar')

app.post('/profile', function (req, res) {
  upload(req, res, function (err) {
    if (err instanceof multer.MulterError) {
      // 發生錯誤
    } else if (err) {
      // 發生錯誤
    }

    // 一切都好
  })
})

定制存儲引擎

如果你想要構建自己的存儲引擎,請看 這里 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM