通常の本文に加えて、メディアのアップロードをサポートする API メソッドがいくつかあります。
その場合、通常のリクエスト メソッドはオーバーロードされ、
アップロードするには Stream
。
概要
アップロードする Stream
には、再開可能
メディア アップロード: ストリームを小さなチャンクに分けてアップロードできます。
これは、大容量のファイルを転送する場合や、
ネットワークの中断やその他の通信の
失敗する機会も多くなります
また、ネットワーク障害が発生した場合に、帯域幅の使用量を減らすこともできます。
大きなファイルのアップロードを最初からやり直す必要がないためです。
ResumableMediaUpload
再開可能なメディア アップロードは Google API .NET クライアント ライブラリの機能の 1 つ リリースされています。 Google API 固有のライブラリには、API 呼び出しのための便利なメソッドが 操作できます。
再開可能なメディア アップロード プロトコルについては、
Drive API のメディア アップロード ページ
関心の対象となっている主なクラスは
ResumableUpload
。
この実装では、メディア コンテンツはチャンクでアップロードされます。
デフォルトのチャンクサイズは 10 MB ですが、
リクエストの ChunkSize
プロパティを 256 KB の倍数に設定する。
リクエストでサーバーエラーが発生した場合、指数バックオフ
ポリシーを使用して、アップロードに失敗したバイトが再送信されます。
デフォルトでは、指数バックオフはクライアント リクエストごとに有効になっています。
リソースの作成時にデフォルトの動作を
新しいサービス オブジェクトを
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");