Загрузить медиа

Несколько методов API поддерживают загрузку мультимедиа в дополнение к обычному телу. В этом случае метод обычного запроса перегружается, чтобы получить дополнительный Stream для загрузки.

Обзор

Для любого Stream , который вы хотите загрузить, вам следует использовать возобновляемую загрузку мультимедиа, которая позволяет загружать потоки меньшими частями. Это особенно полезно, если вы передаете большие файлы и высока вероятность сбоя сети или какого-либо другого сбоя передачи. Это также может снизить использование полосы пропускания в случае сбоев сети, поскольку вам не придется перезапускать загрузку больших файлов с самого начала.

ВозобновляемыйMediaUpload

Возобновляемая загрузка мультимедиа была функцией клиентской библиотеки Google API .NET начиная с бета-версии 1.2.0. Библиотеки, специфичные для Google API, содержат удобные методы для взаимодействия с этой функцией.

Протокол возобновляемой загрузки мультимедиа описан, например, на странице загрузки мультимедиа для Drive API . Основной интересующий нас класс — ResumableUpload . В этой реализации медиаконтент загружается частями.

Размер фрагмента по умолчанию составляет 10 МБ, но его можно изменить, задав для свойства ChunkSize запроса любое значение, кратное 256 КБ. Если в запросе обнаруживается ошибка сервера, то для повторной отправки байтов, которые не были успешно загружены, используется политика экспоненциальной отсрочки. По умолчанию экспоненциальная отсрочка включена для каждого клиентского запроса. Вы можете изменить поведение по умолчанию при создании нового объекта службы, изменив свойство DefaultExponentialBackOffPolicy в BaseClientService.Initializer и/или задав для свойства HttpClientInitializer собственную реализацию IConfigurableHttpClientInitializer , которая добавляет некоторую политику отсрочки.

Методы, поддерживающие загрузку мультимедиа, указаны в справочной документации для документации по API. Для этих методов API добавлены удобные методы Upload и UploadAsync . Эти методы принимают Stream для загрузки и тип его контента в качестве параметров.

Убедитесь, что позиция загружаемого вами потока равна 0, иначе вы получите сообщение об ошибке, например «System.InvalidOperationException: данный заголовок не найден».

Обратите внимание, что из-за поведения класса 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");