上傳媒體

除了一般主體外,還有幾種 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");