通常の本文に加えて、メディアのアップロードをサポートする 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");