メディアをアップロード

通常の本文に加えて、メディアのアップロードをサポートする 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 のプロパティ または <ph type="x-smartling-placeholder"></ph> 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");