關於node實現檔案上傳

五角六芒星_發表於2018-08-07

關於node實現檔案上傳

關於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:{}
  });
複製程式碼

有兩個選項可用,destinationfilename。他們都是用來確定檔案儲存位置的函式。

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!'))

}
複製程式碼

尾聲

俗話說:說的在好也不如親自動手實踐一下,之前感覺沒什麼困難,但是實際操作去寫的時候還是發現不少問題存在。 還是需要努力!!

相關文章