[前端筆記] 用 axios 串接 imgur API上傳圖片

Emmie Lin
4 min readJan 30, 2019

--

這次接API遇到滿多問題的(很廢),請教估狗大神、參考一堆國內外資源,覺得還是彙整一下以防自己下次又忘記,簡單提要一下練習重點:

  1. 主要實作功能:圖片上傳
  2. 接觸技術:API串接、axios、vue.js(非重點)

Step 1. 註冊Imgur App,並拿到client ID

(此處主要參考https://auguston.github.io/imgur-api-upload-load/

註冊Imgur App :若沒有先登入imgur會被導到登入頁面,登入之後會被重新導向,建議先登入再點連結。

按照申請步驟最後會拿到一組client ID(重要),忘記了可以到setting→application找。

Step 2. 開始寫程式囉

(此處主要參考https://serversideup.net/uploading-files-vuejs-axios/

首先使用vue當中的ref屬性直接取得input DOM元素,並設置監聽事件(當檔案被選取,事件就會觸發)

<input type=”file” name=”file” ref=”file” @change=”handleFileUpload”>

接著把data的file綁定到事件觸發後取得的檔案資料

data: {
file:''
},
methods: {
handleFileUpload() {
this.file = this.$refs.file.files[0];
},
....}

接著設置上傳按鈕,並綁定監聽事件

<button @click=”onSubmit”>upload</button>

Step 3. 查看官方文件,決定要帶的參數資料

重點來了,按鈕綁的監聽事件方法,就是要發ajax的地方,而這個request要夾帶哪些參數呢?其實官方API文件都有範例程式碼滿清楚的,不過我一開始看還是有點眼花撩亂,因為真的很多…

首先找到我們要的方法

參照範例,並決定自己需要的參數:

(官方的範例用JQuery發ajax request,但在這裡我是用axios)

let formData = new FormData();
formData.append(‘image’, this.file); //required
formData.append(‘title’, ‘test’); //optional
formData.append(‘description’, ‘test’); //optional
axios({
method: 'POST',
url: 'https://api.imgur.com/3/image',
data: formData,
headers: {
Authorization: "Client-ID " + {{apiKey}} //放置你剛剛申請的Client-ID
},
mimeType: 'multipart/form-data'
}).then(res => {
console.log(res)
}).catch(e => {
console.log(e)
})

終於看到 response status 200 真的是很感動,因為以前使用 axios 都只用到最陽春的設定(第一個參數=網址,第二個參數=要傳送的物件),還沒碰過這種要夾帶headers的,這時候真的就是要回去好好讀文件!搞得好多次都得到 400 Bad request 還有 401、403,就順便複習這些4開頭(代表用戶端發生錯誤)的狀態碼所代表的意義吧!

  • 400 Bad request:通常是因為參數錯誤,沒有傳遞請求必須夾帶的參數或是參數類型不匹配
  • 401 Unauthorized:沒有帶認證資料或者帶了錯誤的認證資料
  • 403 Forbidden:用戶端帶了正確的參數,,但傳遞參數的用戶沒有權限訪問此站,伺服器收到請求但拒絕提供服務

好了,筆記到這邊差不多結束,如果之後想到別的再補充囉!

--

--