--- tags: Node.js 直播班 - 2023 春季班 --- # 🏅 Day 32 - multer 處理上傳檔案 接下來第七週會製作上傳圖片功能,並實作 Imgur 串接 使用者上傳圖片 POST 請求,檔案會以 form data 的形式傳送到後端, 因此會使用到 multer 套件處理接收到的資料 Multer 為一個 node.js middleware,處理 multipart/form-data 資料,主要用於上傳檔案 **範例** ```javascript // app.js const uploadRouter = require('./routes/upload'); app.use('/api/v1/upload', uploadRouter); // routes/upload.js const multer = require('multer') const upload = multer().any(); app.post('/', function (req, res) { upload(req, res, () => { // 這裡先回傳以下,接下來會串接 Imgur 將以成功處理的圖片上傳至 Imgur 相簿 res.send({ status: 'success' }); }) ``` 其中 `multer()` 可以加入 options 設定,這裡主要會加入 [fileFilter](https://github.com/expressjs/multer#filefilter) 及 [limits](https://github.com/expressjs/multer#limits) 限制上傳圖片檔案類型以及最大檔案容量 **範例** ```javascript // routes/upload.js 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(); // path.extname() 取得副檔名(如 .jpg) if (ext !== '.jpg' && ext !== '.png' && ext !== '.jpeg') { // 拒絕上傳的檔案 cb('檔案格式錯誤,僅限上傳 jpg、jpeg 與 png 格式。'); } // 接受檔案 cb(null, true); }, }).any(); ``` ### 參考資源 - [Express multer](https://github.com/expressjs/multer) - [path.extname(path)](https://nodejs.org/api/path.html#pathextnamepath) ## 題目 請參考上方範例,加入上傳圖片路由 POST `/api/v1/upload`,使用 multer 套件處理 form-data,若有上傳圖片成功則回傳成功訊息 :::spoiler POSTMAN 範例圖 ![](https://i.imgur.com/eUg6H4f.png) 選擇 `form-data` 並選擇傳送 file ::: ## 回報流程 將答案連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: ```javascript // app.js const uploadRouter = require('./routes/upload'); app.use('/api/v1/upload', uploadRouter); // routes/upload.js 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(); app.post('/', function (req, res) { upload(req, res, () => { // 這裡先回傳以下,接下來會串接 Imgur 將以成功處理的圖片上傳至 Imgur 相簿 res.send({ status: 'success' }); }) ``` --> 回報區 --- | 報數 | 組別/Discord 名字 | Codepen/HackMD/其他回饋 | |:----:|:-----------------------:|:-------------------------------------------------------------------------:| | 1 | 中 4 組 / jimkk159 | [HackMD - Day 32](https://hackmd.io/_txRlFG-QNesNIyfI5sgrA) |