除了一般內容之外,幾種 API 方法也支援上傳媒體。在這種情況下,系統會對一般要求方法進行過載,以便取得額外的 Stream
進行上傳。
總覽
針對所有要上傳的 Stream
,請使用支援續傳功能。
媒體上傳,可將串流以較小的片段上傳。
如果您要傳輸大型檔案
以及網路中斷或其他傳輸
通常代表失敗
這也可以在網路發生問題時減少頻寬用量
因為您不需要從頭開始上傳大型檔案
ResumableMediaUpload
自 1.2.0-beta 版起,可暫停的媒體上傳功能已是 Google API .NET 用戶端程式庫的功能。Google API 專屬程式庫包含與此功能互動的便利方法。
支援續傳的媒體上傳通訊協定,例如
Drive API 的媒體上傳頁面。
我們要關注的主要類別是 ResumableUpload
。在這個實作中,媒體內容會分成多個區塊上傳。
預設的區塊大小為 10 MB,但您可以將要求的 ChunkSize
屬性設為任何 256 KB 的倍數,藉此變更區塊大小。如果要求中發生伺服器錯誤,系統會使用指數輪詢政策重新傳送未成功上傳的位元組。根據預設,系統會為每個用戶端要求啟用指數輪詢功能。您可以變更 BaseClientService.Initializer
上的 DefaultExponentialBackOffPolicy
屬性,以及/或者將 HttpClientInitializer
屬性設為您自己的 IConfigurableHttpClientInitializer
實作,藉此變更建構新服務物件時的預設行為,並新增一些回退政策。
您可以在 API 專屬說明文件的參考資料說明文件中,找到支援媒體上傳作業的方法。針對這些 API 方法,我們新增了便利的 Upload
和 UploadAsync
方法。這些方法會將要上傳的 Stream
及其內容類型做為參數。
請確認上傳的串流位置為 0,否則會收到錯誤訊息,例如「System.InvalidOperationException: The given header was not found」。
請注意,由於架構的 HttpClient
類別行為,如果上傳作業逾時,系統會擲回 TaskCanceledException
。如果您看到此例外狀況,請考慮手動增加 Timeout
屬性中的
您的服務物件使用的用戶端。
程式碼範例
// Create the service using the client credentials. var service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Application_Name" }); using var uploadStream = System.IO.File.OpenRead("Local_File_Name"); // Create the File resource to upload. Google.Apis.Drive.v3.Data.File driveFile = new Google.Apis.Drive.v3.Data.File { Name = "Drive_File_Name" }; // Get the media upload request object. FilesResource.CreateMediaUpload insertRequest = service.Files.Create( driveFile, uploadStream, "image/jpeg"); // Add handlers which will be notified on progress changes and upload completion. // Notification of progress changed will be invoked when the upload was started, // on each upload chunk, and on success or failure. insertRequest.ProgressChanged += Upload_ProgressChanged; insertRequest.ResponseReceived += Upload_ResponseReceived; await insertRequest.UploadAsync(); static void Upload_ProgressChanged(IUploadProgress progress) => Console.WriteLine(progress.Status + " " + progress.BytesSent); static void Upload_ResponseReceived(Google.Apis.Drive.v3.Data.File file) => Console.WriteLine(file.Name + " was uploaded successfully");