いくつかの API メソッドでは、通常の本文に加えて、メディアのアップロードがサポートされています。その場合、通常のリクエスト メソッドがオーバーロードされ、アップロードする Stream
が追加されます。
概要
アップロードする Stream
には、再開可能なメディア アップロードを使用する必要があります。これにより、ストリームをより小さなチャンクでアップロードできます。これは、サイズの大きいファイルを転送する際に、ネットワークの中断やその他の送信障害が発生する可能性が高い場合に特に役立ちます。また、大きなファイルのアップロードを最初からやり直す必要がないため、ネットワーク障害が発生した場合の帯域幅の使用量を削減できます。
ResumableMediaUpload
再開可能なメディア アップロードは、1.2.0 ベータ版以降、Google API .NET クライアント ライブラリの機能として提供されています。Google API 固有のライブラリには、この機能を操作するのに便利なメソッドが用意されています。
再開可能なメディア アップロード プロトコルについては、Drive API のメディア アップロード ページなどをご覧ください。対象となるメインクラスは ResumableUpload
です。この実装では、メディア コンテンツはチャンクでアップロードされます。
デフォルトのチャンクサイズは 10 MB ですが、リクエストの ChunkSize
プロパティを 256 KB の任意の倍数に設定することで、チャンクサイズを変更できます。リクエストでサーバーエラーが発生した場合は、指数バックオフ ポリシーを使用して、アップロードに失敗したバイトが再送信されます。
デフォルトでは、クライアント リクエストごとに指数バックオフが有効になっています。新しいサービス オブジェクトを作成するときにデフォルトの動作を変更するには、BaseClientService.Initializer
の
DefaultExponentialBackOffPolicy
プロパティを変更するか、バックオフ ポリシーを追加する IConfigurableHttpClientInitializer
の独自の実装に
HttpClientInitializer
プロパティを設定します。
メディア アップロードをサポートするメソッドは、API 固有のドキュメントのリファレンス ドキュメントに記載されています。
これらの API メソッドには、便利な Upload
メソッドと UploadAsync
メソッドが追加されています。これらのメソッドは、アップロードする Stream
とそのコンテンツ タイプをパラメータとして受け取ります。
アップロードするストリームの位置が 0 であることを確認します。0 でない場合、「System.InvalidOperationException: The provided 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");