メディアをアップロード

通常の本文に加えて、メディアのアップロードをサポートする 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 メソッドの場合、便宜上 UploadUploadAsync メソッドが追加されました。 これらのメソッドは、アップロードする 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");