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 upload.

Informações gerais

Para qualquer Stream que você queira enviar, use o upload de mídia retomável, que permite o upload em blocos menores. Isso é especialmente útil se você está transferindo arquivos grandes e a probabilidade de uma interrupção de rede ou alguma outra falha de transmissão é alta. Isso também pode reduzir o uso da largura de banda em caso de falhas na rede, porque não é necessário reiniciar os uploads de arquivos grandes desde o início.

ResumableMediaUpload

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

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

O tamanho padrão do bloco é de 10 MB, mas é possível alterá-lo 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 política de espera exponencial será usada para reenviar os bytes que não foram enviados. Por padrão, a espera exponencial é 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 alguma política de espera.

Os métodos que permitem o upload de mídia são identificados na documentação de referência específica da API. Para esses métodos de API, foram adicionados os métodos de conveniência Upload e UploadAsync. 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, você receberá um erro, como "System.InvalidOperationException: The provided header was not found".

Devido ao comportamento da classe HttpClient do framework, se o upload expirar, uma TaskCanceledException será gerada. Se você encontrar essa exceção, aumente 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");