上傳檔案到 Google 雲端硬碟 ( Google Drive )
Google 雲端硬碟 ( Google Drive ) 是目前最多人使用的雲端儲存空間,這篇教學會介紹申請 Google Cloud 服務的金鑰,接著串接 Google 的雲端硬碟 API,實現透過 Python 上傳檔案到 Google 雲端硬碟的功能。
快速導覽:
本篇使用的 Python 版本為 3.9.6,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
啟用 Google Drive API
使用 Google 帳號登入後,開啟 Google Cloud 雲端運算服務頁面,點擊右上角「控制台」。
Google Cloud 雲端運算服務:https://cloud.google.com/?hl=zh-TW
點擊後會進入「My First Project」專案,這是每個帳號預設使用的第一個專案,點擊左上角按鈕開啟選單,選擇「API 和服務 > 已啟用的 API 和服務」。
點擊上方「啟用 API 和服務」,準備啟用預設關閉的 Google Drive API。
在 API 搜尋欄位搜尋「google drive api」。
找到 Google Drive API 後,點擊「啟用」將其啟用。
啟用後,點擊左側「憑證」開啟憑證管理頁面,點擊上方「建立憑證」按鈕,選擇「服務帳戶」,表示要透過外部伺服器進行控制。
設定新憑證的服務帳戶名稱和 ID,新憑證的服務帳戶就會建立完成。
產生金鑰 JSON
服務帳戶建立完成後,點擊「管理金鑰」,可從後方「...」開啟選單,或進入服務帳戶後點擊「金鑰」頁籤。
點擊「新增金鑰 > 建立新的金鑰」。
選擇 JSON 後,點擊「建立」。
就會下載一份金鑰的 JSON 檔案到電腦中。
開啟 Google Drive 資料夾共用權限
另開一個瀏覽器的視窗或分頁,登入 Google 帳號後前往自己的 Google 雲端硬碟,新增一個資料夾,並設定資料夾的共用權限為「編輯者」。
進入資料夾後,觀察資料夾的網址,記住 folders 後方的代碼,這串代碼是資料夾的 ID。
編輯程式,上傳檔案
一開始先使用命令安裝 google 與 googleapiclient 套件 ( Colab 或 Anaconda 使用 !pip )。
pip install google google-api-python-client
如果使用 Google Colab,需要先掛接自己的雲端硬碟 ( 才能選擇檔案上傳 )。
將剛剛下載的金鑰 JSON 檔案,放到和要執行的 python 檔案同樣的資料夾裡,使用 Google 官方提供的範例程式碼,修改資料夾 ID、金鑰 JSON 名稱以及要上傳的檔案名稱,執行後就能將檔案上傳到 Google 雲端硬碟裡。
參考:上傳檔案資料
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 Colab 要換路徑使用,本機環境不需要
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
UPLOAD_FOLDER = '你的 Google 雲端資料夾 ID'
SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = '你的金鑰檔案路徑與名稱' # 金鑰檔案
# 建立憑證
creds = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
# 串連服務
service = build('drive', 'v3', credentials=creds)
filename = "mona-s.jpg" # 要上傳檔案的路徑與名稱
media = MediaFileUpload(filename) # 建立檔案物件
file = {'name': filename, 'parents': [UPLOAD_FOLDER]}
print("開始上傳檔案...")
file_id = service.files().create(body=file, media_body=media).execute()
print(file_id) # 印出上傳檔案後的結果
如果是二進位的圖片檔案 ( 使用者上傳、OpenCV 拍照...等 ),則參考下方程式碼,使用 MediaIoBaseUpload
的方法,搭配 cv2.imencode
或 io.BytesIO
轉換後就能上傳。
jpg = cv2.imencode('.jpg', image)[1] # 將 OpenCV 的圖片 numpy 陣列轉換成 jpg
imageBytes = io.BytesIO(jpg) # 將 jpg 轉換成二進位
media = MediaIoBaseUpload(imageBytes, mimetype='image/jpg', resumable=True)
file = {'name': filename, 'parents': [UPLOAD_FOLDER]}
print("正在上傳檔案...")
file_id = service.files().create(body=file, media_body=media).execute()
print('雲端檔案ID:' + str(file_id['id']))
前往 Google 雲端硬碟分享的資料夾裡,就會看見出現了上傳的檔案,擁有者則是 Google Cloud 服務帳戶名稱。
更多應用
如果可以將檔案上傳到 Google 雲端硬碟,不論是攝影機畫面或爬蟲資料,都能運用 Google 雲端硬碟進行備份的動作,是相當方便實用的功能!下方列出一些連動 Google 雲端硬碟的範例:
參考
- https://github.com/googleapis/google-api-python-client
- https://developers.google.com/drive/api/guides/manage-uploads
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~