關於node實現檔案上傳
使用Multer
Multer 是一個 node.js 中介軟體,用於處理 multipart/form-data 型別的表單資料,它主要用於上傳檔案。它是寫在 busboy 之上非常高效。
注意: Multer 不會處理任何非 multipart/form-data 型別的表單資料。
npm install --save multer
複製程式碼
使用方法
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) {
// Do something
})
// 多檔案上傳
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
// Do something
})
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) 鍵是檔名,值是檔案陣列
// Do something
})
複製程式碼
DiskStorage
import multer from 'multer';
var storage = multer.diskStorage({
//設定上傳檔案路徑,以後可以擴充套件成上傳至七牛,檔案伺服器等等
//Note:如果你傳遞的是一個函式,你負責建立資料夾,如果你傳遞的是一個字串,multer會自動建立
destination: config.uploadPath, // process.cwd() + '/public/uploads'
//TODO:檔案區分目錄存放
filename: function (req, file, cb) {
var fileFormat = (file.originalname).split(".");
cb(null, fileFormat[0] + "." + fileFormat[fileFormat.length - 1]);
}
});
//新增配置檔案到muler物件。
var upload = multer({
storage: storage,
//其他設定請參考multer的limits
//limits:{}
});
複製程式碼
有兩個選項可用,destination
和 filename
。他們都是用來確定檔案儲存位置的函式。
destination
是用來確定上傳的檔案應該儲存在哪個資料夾中。也可以提供一個 string
(例如 '/tmp/uploads'
)。如果沒有設定 destination
,則使用操作預設的臨時資料夾
注意: 如果你提供的 destination
是一個函式,你需要負責建立資料夾。當提供一個字串,multer 將確保這個資料夾是你建立的。
filename
用於確定資料夾中的檔名的確定。 如果沒有設定 filename
,每個檔案將設定為一個隨機檔名,並且是沒有副檔名的
注意: Multer 不會為你新增任何副檔名,你的程式應該返回一個完整的檔名。
每個函式都傳遞了兩個請求 (req
) 和一些關於這個檔案的資訊 (file
) 有助於你的決定。
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!'))
}
複製程式碼
尾聲
俗話說:說的在好也不如親自動手實踐一下,之前感覺沒什麼困難,但是實際操作去寫的時候還是發現不少問題存在。 還是需要努力!!