Fazer upload de mídia

Vários métodos de API oferecem suporte ao upload de mídia, além do corpo normal. Nesse caso, o método de solicitação normal é sobrecarregado para receber um Stream adicional para fazer upload.

Visão geral

Para qualquer Stream que você queira fazer upload, use o upload de mídia retomável, que permite que os streams sejam enviados em partes menores. Isso é muito útil na transferência de arquivos grandes, e a probabilidade de interrupção da rede ou alguma outra transmissão o número de falhas é alta. Ele também pode reduzir o uso de largura de banda no caso de falhas de rede, porque você não precisa reiniciar uploads de arquivos grandes desde o início.

ResumableMediaUpload

O upload de mídia retomável é um recurso da biblioteca de cliente .NET da API Google desde a versão 1.2.0-beta. As bibliotecas específicas da API do Google contêm métodos de conveniência para interagir com esse recurso.

O protocolo de upload de mídia retomável é descrito, por exemplo, na página de upload de mídia da API Drive. A classe principal de interesse é ResumableUpload. Nesta implementação, o conteúdo de mídia é enviado em blocos.

O tamanho de bloco padrão é de 10 MB, mas você pode mudar isso definindo a propriedade ChunkSize na solicitação para qualquer múltiplo de 256 KB. Se um erro de servidor for encontrado em uma solicitação, a espera exponencial é usada para reenviar os bytes que não foram enviados. Por padrão, a espera exponencial está ativada para cada solicitação do cliente. É possível mudar o comportamento padrão ao criar um novo objeto de serviço mudando a propriedade DefaultExponentialBackOffPolicy em BaseClientService.Initializer e/ou definindo a propriedade HttpClientInitializer para sua própria implementação de IConfigurableHttpClientInitializer que adiciona uma política de desistência.

Os métodos que permitem o upload de mídia são identificados na documentação de referência para a documentação específica da API. Para esses métodos de API, a conveniência de Upload e Os métodos UploadAsync foram adicionados. Esses métodos usam um Stream para fazer upload e o tipo de conteúdo dele como parâmetros.

Verifique se a posição do stream que você enviou é 0. Caso contrário, vai receber um erro, como "System.InvalidOperationException: The given header was not found".

Devido ao comportamento da classe HttpClient do framework, se o upload expirar, uma TaskCanceledException será gerada. Se essa exceção aparecer, considere aumentar manualmente a propriedade Timeout no cliente usado pelo objeto de serviço.

Exemplo de código

// 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");