1. 程式人生 > >Express檔案上傳中介軟體Multer

Express檔案上傳中介軟體Multer

前言:

Express預設並不處理HTTP請求體中的資料,對於普通請求體(JSON、二進位制、字串)資料,可以使用body-parser中介軟體。而檔案上傳(multipart/form-data請求),可以基於請求流處理,也可以使用formidable模組或Multer中介軟體。

Multer中介軟體:

Multer是Express官方推出的,用於Node.jsmultipart/form-data請求資料處理的中介軟體。

它基於busboy構建,可以高效的處理檔案上傳,但並不處理multipart/form-data之外的使用者請求。

使用:

Multer在解析完請求體後,會向Request物件中新增一個body物件和一個file或files物件(上傳多個檔案時使用files物件 )。其中,body物件中包含所提交表單中的文字欄位(如果有),而file(或files)物件中包含通過表單上傳的檔案。

方法:

引用multer模組後,我們會獲取到一個頂級方法。該方法是一個工廠函式,可以使用這個方法建立Multer物件。它接受一個選項物件,最基本的選項是dest,它告訴 Multer 檔案的儲存位置。如果忽略該選項,檔案會被儲存在記憶體中,並且永遠不會寫入硬碟中。

multer解析完上傳檔案後,會被儲存為一個包含以下欄位的物件:

       fieldname - 表單提交的檔名(input控制元件的name屬性)

       originalname - 檔案在使用者裝置中的原始名稱

       encoding - 檔案的編碼型別

       mimetype - 檔案的Mime型別

       size - 檔案的大小

       destination - 檔案的儲存目錄(DiskStorage)

       filename - 檔案在destination中的名稱(DiskStorage)

       path - 上傳檔案的全路徑(DiskStorage)

       buffer - 檔案物件的Buffer(MemoryStorage)

{ fieldname: 'f1',
  originalname: '小清新.png',
  encoding: '7bit',
  mimetype: 'image/png',
  destination: './www/upload/',
  filename: 'd52f74d801ddfca60d14e4c2cf5050cc',
  path: 'www/upload/d52f74d801ddfca60d14e4c2cf5050cc',
  size: 123309 }

.any() - 接收所有檔案

接收請求中的所有檔案。上傳檔案陣列會被儲存在req.files中。

更多關於multer物件中的方法請參見https://www.jb51.net/article/95488.htm

程式碼示例:

const express=require('express');
const bodyParser=require('body-parser');
const multer=require('multer');
const fs=require('fs');
const pathLib=require('path');

var objMulter=multer({dest: './www/upload/'});

var server=express();

server.use(objMulter.any());

server.post('/', function (req, res){
    //新檔名
    //newName = 'www/upload/d52f74d801ddfca60d14e4c2cf5050cc' + '.png'
    var newName=req.files[0].path+pathLib.parse(req.files[0].originalname).ext;
    fs.rename(req.files[0].path, newName, function (err){
        if(err)
            res.send('上傳失敗');
        else
            res.send('成功');
    });

    //1.獲取原始副檔名
    //2.重新命名臨時檔案
});

server.listen(8080);