---
# System prepended metadata

title: "\U0001F3C5 Day 33 - Imgur 串接"
tags: [Node.js 直播班 - 2023 春季班]

---

---
tags: Node.js 直播班 - 2023 春季班
---

# 🏅 Day 33 - Imgur 串接

延續前一天每日任務，使用 multer 將接收到的 form data 處理，在此過程若有出現錯誤，可以透過以下處理 multer 相關錯誤，若無錯誤則可進行 Imgur 串接

請先參考此 [Express Imgur 套件上傳教學](https://israynotarray.com/nodejs/20220517/432259079/)


**範例**（完整範例可觀看 [GitHub](https://github.com/gonsakon/express-week4-sample/tree/week7)）

```javascript=
// app.js
const uploadRouter = require('./routes/upload');
app.use('/api/v1/upload', uploadRouter);

//  routes/upload.js
const imgur = require('imgur');
const sizeOf = require('image-size');
const upload = require('../service/image');
const { ImgurClient } = require('imgur');

router.post('/', function(req, res, next) {

  upload(req, res, async () => {
    // 若上傳檔案不符或沒有成功上傳，回傳錯誤訊息
    if(!req.files.length) {
      return res.status(400).send({
        message: '尚未上傳檔案。'
      });
    }
   // 檢測圖片尺寸
    const dimensions = sizeOf(req.files[0].buffer);
    if(dimensions.width !== dimensions.height) {
      return res.status(400).send({
        message: '圖片長寬不符合 1:1 尺寸。'
      });
    }
   // 加入申請好的 imgur client 資訊
    const client = new ImgurClient({
      clientId: process.env.IMGUR_CLIENTID,
      clientSecret: process.env.IMGUR_CLIENT_SECRET,
      refreshToken: process.env.IMGUR_REFRESH_TOKEN,
    });
    // 將 buffer 編碼為 base64 格式並上傳至指定好的 imgur 相簿
    const response = await client.upload({
      image: req.files[0].buffer.toString('base64'),
      type: 'base64',
      album: process.env.IMGUR_ALBUM_ID
    });
    // 回傳圖片 url
    res.send({ url: response.data.link });

  })

});

```
（21 - 26 行）以設計稿的[修改個人資料頁面](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/screen/c328cf8f-1de3-4de6-b944-245959af7dd0/specs/)（上傳大頭照）為例，需符合
- 圖片比例 1:1 
- 解析度寬度至少 300 像素以上

可以使用 [image-size](https://github.com/image-size/image-size#image-size) 套件取得圖片尺寸相關資訊驗證圖片是否符合比例及最小寬度


（27 - 32 行）串接 Imgur 前，參考 [Express Imgur 套件上傳教學](https://israynotarray.com/nodejs/20220517/432259079/)，註冊 Imgur app 並取得 client Id、client secret、refresh token，加入環境變數中




### 參考資源
- [image-size](https://github.com/image-size/image-size#image-size)
- 範例中使用到 imgur 套件的 [new ImgurClient()](https://github.com/keneucker/imgur#import-and-instantiate-with-credentials) 、[upload()](https://github.com/keneucker/imgur#upload-one-or-more-images-and-videos) 介紹
若是使用 imgur@2.2.0 需另外安裝 [tslib](https://www.npmjs.com/package/tslib)


### 題目

參考上方範例實作**串接 Imgur**
- 需驗證 解析度寬度至少 300 像素以上、圖片長寬比例需符合 1:1 尺寸
- 註冊 Imgur App、取得 refresh token
- 以 POSTMAN 測試可成功回傳圖片網址，並有成功上傳至自己的 Imgur 相簿

***此題目可自行練習，不需回報**



<!-- ## 回報流程

將答案連結貼至底下回報就算完成了喔! 
解答位置請參考下圖（需打開程式碼的部分觀看）

![](https://i.imgur.com/vftL5i0.png) -->

<!-- 解答：  
 解答與範例相同
-->


<!-- 
回報區
---

| 報數 |       組別／Discord 名字       |                            Codepen／HackMD／其他回饋                             |
|:----:|:-----------------------:|:-------------------------------------------------------------------------:|
|  1   |   ...      |           ...         | -->