メディアをアップロード

いくつかの 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");