C# 學習筆記(六): OneDrive API 串接(OneDrive API串接篇)

Tom
appxtech

--

嗨嗨,這篇內容進入了 C# .Net 串接 OneDrive API 的正式內容,會使用 Microsoft Graph 的 nuget package 來操作雲端內容。

Microsoft 把許多服務的 API 都慢慢整合到自家推出的 Microsoft Graph 中,包含整個 Microsoft 365 提供的服務等等,未來串接 Microsoft 的服務會越來越容易。

# 取得 Graph Service Client

首先新增一個 Class,繼承 IAuthenticationProvider,用作 GraphServiceClient 呼叫 Graph API 時提供 Authentication 資訊使用。

接著用下面的 function 即可取得 Graph Service Client,後續要操作 Graph API 的內容都是用這個 Client 了。

# 檔案屬性

OneDrive DriveItem 物件的屬性說明在以下文件中,

OneDrive API 與 Google Drive API之間有很大的不同, OneDrvie API 查詢檔案需要帶上檔案所在的雲端硬碟 DriveId 加上 DriveItemId,這兩個屬性是非常重要的,接下來會一步一步的把基本會用到的 function 介紹給各位。

# Drive — [文件連結]

取得登入使用者的雲端硬碟資料

## Get Me Drive | 取得使用者自身的雲端

Me Drive 會直接指向登入使用者的“我的檔案”。

## Get All Drives | 取得所有雲端硬碟

列出所有使用者可讀取的雲端硬碟

## Get Drive By DriveId | 尋找指定雲端硬碟資訊

用 DriveId 去查詢特定的雲端硬碟。

# DriveItem — [文件連結]

DriveItem 是 OneDrive 中代表所有物件(資料夾、檔案)的 Class,也只有 DriveItem Class 內有雲端中的檔案資料,所以要取得檔案要用下面的程式,先從 Drive 物件中取得 Root(DriveItem),才能從 root 取得根目錄中的資料內容。

## List Drive’s Root Items | 列出根目錄下的檔案清單

取出 DriveItem 後,要判斷是哪種檔案需要看 DriveItem 下的欄位:

  • Folder、File、Image、Photo

哪個欄位有值就帶表此 DriveItem 是該種類的檔案。

內容說明要怎麼判斷撈出來的 DriveItem 是哪種檔案類型

此外,取出 DriveItem 後會發現有許多欄位是 null,原因與 GoogleDrive 一樣,需要的欄位資訊需要在查詢時帶入,雲端才會回傳給你。

這就需要提到 OneDrive 的 OData system query options,詳細內容請前往以下文件。

OData query options 包含以下幾個動作:

  • $expand : 指定將物件的某 Relation 欄位內容加入,如: children
  • $select : 指令將物件的某 Property 欄位內容加入,如: deleted
  • $filter : 將回傳的物件依照條件過濾,[文件連結]
  • $search : 依照指定條件查詢雲端檔案,[文件連結]
  • $orderBy : 依照指定欄位值將物件清單排序,[文件連結]
  • $format : 指定 Graph 回傳使用的格式,如 atom、xml、 json,但不保證所有檔案都會依照此格式回傳。
  • $count : 此欄位為 bool,指明是否統計經過進階查詢後找出的檔案數量。
  • $skip、 $top : 分頁用途。

各位有需求就自由發揮,接下來我繼續介紹幾個基本的功能。

## List DriveItem Children | 列出資料夾下的檔案清單

從 root 找到某個 folder 的 driveItem id 後,就可以把他的 id 帶進來繼續往下看這個 folder 下面有哪些檔案。

## 取得指定 DriveItem 資訊

補上兩個取得單一 DriveItem 資訊的程式。

## Create Folder | 建立資料夾

首先新增一個物件用於發送建立請求。

下面的 function 會將 request.Name 設為資料夾的名稱,設定發生衝突的行為是 “rename” 則不會覆蓋原資料夾,並將資料夾創建在指定 Drive 中的 DriveItem 下,若 DriveItemId 為空,則創建在 Drive 的 root 下。

## Update DriveItem | 修改名稱/移動 雲端檔案

修改檔名 or 移動檔案 or 兩個都做的更新程式如下。

## Delete DriveItem | 刪除 DriveItem

## Download DriveItem | 下載 DriveItem

## Upload Item | 上傳檔案

上傳檔案分為兩種,一種是上傳小於 250MB 的小檔案,另一種是上傳大於 250MB 的大檔案。

上傳小檔案須自己送 http request,又依照是否為取代現有檔案或上傳新檔案而分為兩組 uri,所以需要讀者自行前往文件選擇要使用哪組。

我這邊簡單用一組作為範例,將檔案上傳到指定 itemId 的資料夾中。

上傳大檔案的做法是將檔案切片變成好幾塊,一部份一部份上傳,透過 session 去做各個檔案上傳的管理,這一部份 library 可以呼叫。

OneDrive API 串接的內容就到這邊結束啦,因為內容很多沒辦法所有細節都帶到,也沒有畫面來配合需求開發規劃 api 要怎麼開,所以整個系列都採用介紹基本作法的邏輯來寫,希望讀者看到一半就能有感覺,快速地上手,剩下有其他的需求能在文件中找到答案(真心覺得 Microsoft 的文件不好看懂QQ),有其他疑問歡迎留言討論~謝謝各位。

--

--

Tom
appxtech
Writer for

Major in Computer Science, Web Backend Engineer