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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

Обзор

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

ResumableMediaUpload

Возобновляемая загрузка мультимедиа была функцией клиентской библиотеки 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");