除了一般主體外,還有幾種 API 方法支援上傳媒體。
在這種情況下,一般的要求方法會超載,以取得額外的
Stream
即可上傳。
總覽
針對所有要上傳的 Stream
,請使用支援續傳功能。
媒體上傳,可將串流以較小的片段上傳。
如果您要傳輸大型檔案
以及網路中斷或其他傳輸
通常代表失敗
這也可以在網路發生問題時減少頻寬用量
因為您不需要從頭開始上傳大型檔案
ResumableMediaUpload
支援續傳的媒體上傳功能是 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:找不到指定的標頭。」
請注意,基於架構 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");