通常の本文に加えて、メディアのアップロードをサポートする API メソッドがいくつかあります。
その場合、通常のリクエスト メソッドがオーバーロードされ、アップロードする追加の Stream
が取得されます。
概要
アップロードする Stream
には、再開可能なメディア アップロードを使用する必要があります。これにより、ストリームを小さなチャンクでアップロードできます。これは、大容量のファイルを転送する際に便利です。大容量のファイルはネットワークの中断やその他の送信エラーが起こる可能性が高いからです。また、ネットワーク障害が発生した場合に、帯域幅の使用量を減らすこともできます。
大きなファイルのアップロードを最初からやり直す必要がないためです。
ResumableMediaUpload
再開可能なメディア アップロードは Google API .NET クライアント ライブラリの機能の 1 つ リリースされています。 Google API 固有のライブラリには、API 呼び出しのための便利なメソッドが 操作できます。
再開可能なメディア アップロード プロトコルについては、
Drive API のメディア アップロード ページ
関心の対象となっている主なクラスは
ResumableUpload
。
この実装では、メディア コンテンツはチャンクでアップロードされます。
デフォルトのチャンクサイズは 10 MB ですが、リクエストの ChunkSize
プロパティを 256 KB の倍数に設定することで変更できます。リクエストでサーバーエラーが発生した場合、指数バックオフ
ポリシーを使用して、アップロードに失敗したバイトが再送信されます。
デフォルトでは、指数バックオフはクライアント リクエストごとに有効になっています。
リソースの作成時にデフォルトの動作を
新しいサービス オブジェクトを
<ph type="x-smartling-placeholder"></ph>
DefaultExponentialBackOffPolicy
BaseClientService.Initializer
のプロパティ
または
HttpClientInitializer
プロパティを IConfigurableHttpClientInitializer
の独自の実装にマッピングします。
バックオフ ポリシーを追加します。
メディア アップロードをサポートする方法
をご覧ください。
これらの API メソッドの場合、便宜上 Upload
と
UploadAsync
メソッドが追加されました。
これらのメソッドは、アップロードする Stream
とそのコンテンツ タイプをパラメータとして受け取ります。
アップロードするストリームの位置が 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");