1. 程式人生 > >node.js學習筆記(8)--multer模組檔案上傳

node.js學習筆記(8)--multer模組檔案上傳

1.簡介

multer是一個node.js檔案上傳中介軟體,它是在 busboy的基礎上開發的!

multer必須指定 enctype="multipart/form-data".

2.安裝

npm install multer -save

3.使用

1.建立專案

新建一個express專案 multer (如何建立請看前面章節) 安裝好所有依賴模組 . (注意 我們最好不要用模組名稱作為專案名,因為會使我們該模組安裝失敗)
<span style="color:#333333;">E:\nodeTest\multer>npm install multer -save
npm WARN install Refusing to install multer as a dependency of itself</span>
解決方法:修改package.json 裡面的name (隨便改,我改成multer-test)

2.建立檢視頁面

建立一個form表單,注意別忘記設定enctype。 寫一個if語句,如果存在image則顯示這個image,否則顯示錶單。 注意,不能直接寫if(image){}else{} 因為會報錯:image is not defined。
我們需要通過 typeof 來檢測image是否被定義並且存在。
//index.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>

    <% if(typeof(image) !== 'undefined' && image){ %>
      <img src="<%=image%>">
    <%}else{%> 
    <form action="/upload" enctype="multipart/form-data" method="POST">
      <input type="file" name="image">
      <input type="submit" value="上傳">
    </form> 
    <%}%>
  </body>
</html>


3.建立路由

接下來我們在路由裡面寫上傳邏輯: 我們載入multer模組 ,並且設定儲存路徑(如果不設定則檔案會儲存在記憶體中,永遠不會存入磁碟). 我們在專案根目錄新建資料夾uploads(與public同級),該資料夾就為我們的上傳路徑.
//index.js
var express = require('express');
var router = express.Router();
var multer  = require('multer')

//設定儲存路徑
var upload = multer({ dest: 'uploads/' })

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
 
router.post('/upload', upload.single("image"), function(req, res, next) {
  //檔案路徑
  var image=req.file.path;
  res.render('index', { title : 'Express' ,image:image});
});

module.exports = router;

4.託管靜態檔案

我們選擇檔案,點選上傳,會發現圖片找不到。
我們開啟upload 發現圖片已經上傳上去了
查詢下express api,發現靜態檔案訪問是需要通過express.static()方法設定的 (API) 我們修改 app.js檔案 找到該行程式碼(應該是23行)  
app.use(express.static(path.join(__dirname, 'public')));
再新增一行程式碼  其中前面的uploads是一個掛載路徑 如果不加 訪問圖片則為 localhost:3000/imageName ,加了之後則為 localhost:3000/uploads/imageName   _dirname是當前專案的完整絕對路徑.  我的為e:\nodeTest\multer

path.join(_dirname,'uploads‘) 則為  e:\nodeTest\multer\uploads

app.use('/uploads',express.static(path.join(__dirname, 'uploads')))
重啟服務,重新上傳圖片。 成功啦!!!  http://

5.multer多種上傳

官方例子提供了多種種方法上傳
<pre name="code" class="javascript">//單個檔案上傳
upload.single("image") //image為檔案name
//獲得檔案:req.file

//多個相同name檔案上傳
upload.array("image",maxCount) //image為多個相同檔案name ,maxCount則為最大上傳個數 ,也可以不設定
//獲得檔案 req.files

//多個不同name檔案上傳
upload.fields([{name:'image',maxCount:'1'},{name:'txt',maxCount:'2'}])
//name 則為上傳檔案name  ,maxCount為該name檔案最大上傳個數 ,可以不設定
//獲得檔案 req.files.image   req.files.txt
multer還有許多功能,總體來說能滿足我們日常需求,想詳細瞭解請看API

4.其他

由於之前專案的multer版本是0.1.8版本的 而剛剛新建的是1.1.0版本的 兩者在寫法上是有很大的不同的(被坑死了) 所以,如果報錯了看看是不是版本問題!!