# 🏅 Day 32 - multer 處理上傳檔案
[Multer](https://github.com/expressjs/multer) 為一個 node.js middleware,處理 multipart/form-data 資料,主要用於上傳檔案。
使用者上傳圖片 POST 請求,檔案會以 form data 的形式傳送到後端,因此會使用到 `multer()` 處理接收到的資料。
`multer()` 可以加入 options 設定,這裡主要會加入 [fileFilter](https://github.com/expressjs/multer#filefilter) 及 [limits](https://github.com/expressjs/multer#limits) 限制上傳圖片檔案類型以及最大檔案容量。
範例:
`routes/upload.js`
```javascript=
const multer = require('multer');
const path = require('path');
const upload = multer({
limits: {
fileSize: 2 * 1024 * 1024,
},
fileFilter (req, file, cb) {
// path.extname() 取得副檔名(如 .jpg)
const ext = path.extname(file.originalname).toLowerCase();
// 如果不是 .jpg, .png, .jpeg 就拒絕上傳檔案
if (ext !== '.jpg' && ext !== '.png' && ext !== '.jpeg') {
cb('檔案格式錯誤,僅限上傳 jpg、jpeg 與 png 格式。');
}
// 接受檔案
cb(null, true);
},
}).any();
```
題目(回到任務)
---
練習運用上方範例,帶入上傳圖片路由 `POST /upload`,使用 multer 套件處理 form-data,若有上傳圖片成功則回傳成功訊息 `status: 'success'`
完整下方程式碼 `...` 的部分
`app.js`:
```javascript=
const uploadRouter = require('./routes/upload');
app.use('/upload', uploadRouter);
```
`routes/upload.js`:
```javascript=
const multer = require('multer');
const path = require('path');
const upload = multer({
limits: {
fileSize: 2 * 1024 * 1024,
},
fileFilter (req, file, cb) {
const ext = path.extname(file.originalname).toLowerCase();
if (ext !== '.jpg' && ext !== '.png' && ext !== '.jpeg') {
cb('檔案格式錯誤,僅限上傳 jpg、jpeg 與 png 格式。');
}
cb(null, true);
},
}).any();
router.post('/upload', (req, res) => {
upload(req, res, () => {
res.send({
status: 'success'
})
})
})
```
### 參考資源
- [path.extname(path)](https://nodejs.org/api/path.html#pathextnamepath)
- [expressjs / multer](https://github.com/expressjs/multer)