python 開發一款圖片壓縮工具(四):上傳圖牀

上一篇使用了 pngquant 圖片壓縮工具進行壓縮,並經過 click 命令行工具構建了 picom 包。這篇的主要功能是實現圖片上傳。python

圖片上傳功能的實現

經過 pngquant 壓縮圖片後,獲得一個 -fs8.png 爲後綴的圖片。想要把圖片上傳到雲端,只須要把這個文件經過 API 發送給圖片存儲服務商就能夠了。web

先實現 sm.ms 網站的圖片上傳。官方提供了 API 文檔,照着文檔傳入參數就能夠搞定,so easy.json

image.png
image.png

上傳接口的參數說明:api

  1. content-type 爲 multipart/form-data ;
  2. Authorization 爲可選項,當不須要用戶管理時,能夠不填;
  3. 傳入文件的參數名爲 smfile。

對應的 python 代碼:session

api_addr = 'https://sm.ms/api/v2/upload'
files = {
 "smfile": open(file, 'rb')
}
res = requests.post(url, files=files)

獲取上傳的圖片地址

文件上傳完畢之後,須要經過 API 的響應結果獲得圖片的 URL。 sm.ms 的響應結果包含 2 種狀況:異步

  1. 當圖片已經上傳過一次,會經過圖片的 hash 值判斷出重複。響應中的 code 爲 image_repeated, 能夠經過 images 取得以前已存在的圖片地址。
{
 "code""image_repeated",
 "images""https:..."
}
  1. 當圖片是第一次上傳,code 爲 success, 能夠經過 data 中的 url 獲取圖片地址。
{
 "code""success",
 "data": {
        "url""https:..."
    }
}

因此在上傳的函數中添加判斷,獲取圖片 url:編輯器

resp = res.json()
code = resp.get('code')
if code == 'image_repeated':
 url = resp["images"]
 return url
elif code == 'success':
 return resp["data"]["url"]

由於有時候並非上傳單張圖片,而是要上傳整個文件夾下面的圖片,一次性須要處理多張圖片的上傳操做,因此能夠共用一個 session, 對應的上傳圖片類:函數

image.png
image.png

爲命令行添加 --upload 可選參數

如今我能夠選擇是否把圖片上傳到網上,若是須要上傳,就添加 --upload 參數;若是不須要上傳,就不傳這個命令行參數:工具

picom elephant.png -f --upload

增長 --upload 可選參數只須要在 cli 函數上多加一個 option, 而後添加上傳代碼就能夠了:post

image.png
image.png

最後獲得的運行結果:

image.png
image.png

經過 yaml 記錄以及上傳過的圖片地址

上面上傳的圖片地址是在命令行顯示的,若是一次性使用還好,可是若是須要重複使用就須要把圖片的 URL 保存起來。

sm.ms 的帳號功能能夠管理已經上傳的圖片。因此若是有 sm.ms 的帳號,就不須要這個保存的功能。 可是若是不想去註冊帳號,有一個委曲求全的辦法,就是在當前文件夾建立一個名爲 uploaded_img.yaml 的文件,把已經上傳的圖片地址保存起來。

能夠經過新建一個選項 --record 來選擇是否記錄在本地。python 能夠經過 pyyaml 庫操做 yaml 文件,存儲上傳的圖片數據。 也能夠經過 json 格式保存,大體的格式是這樣的:

{
 "upload":[
  {
   "name""elephant.png",
   "url" : "http://img-server/ofos.png"
  }
 ]
}

由於這個功能不是特別重要,甚至能夠說雞肋,就不貼代碼了。

總結

picom-upload
picom-upload

上傳圖片功能很是簡單,只須要使用 requests 庫的基礎操做就能夠完成各個圖牀服務商的上傳操做。若是以爲 requests 庫的操做比較慢,能夠採用 aiohttp 進行異步傳輸。 這個工具暫且不考慮加快傳輸速度,由於如今的圖牀服務不少都是小本經營,沒什麼盈利能力,爲了能提供長久服務,仍是儘可能少的給別人壓力。

相關文章
相關標籤/搜索