上傳媒體

除了一般內容之外,幾種 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 方法,我們新增了便利的 UploadUploadAsync 方法。這些方法會將要上傳的 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");