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 regular é sobrecarregado para obter uma Stream para fazer upload.

Visão geral

Para todos os Stream que você quiser enviar, utilize retomável upload de mídia, que permite que os streams sejam enviados em partes menores. Isso é muito útil se você estiver transferindo 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 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 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 ao 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 de interesse principal é ResumableUpload Nesta implementação, o conteúdo de mídia é enviado em blocos.

O tamanho padrão do bloco é 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 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 alterar o comportamento padrão ao criar um novo objeto de serviço alterando Propriedade DefaultExponentialBackOffPolicy em BaseClientService.Initializer e/ou definir HttpClientInitializer para sua própria implementação de IConfigurableHttpClientInitializer que inclua uma política de espera.

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.

Certifique-se de que a posição do stream enviado seja 0. Caso contrário, você receberá um erro, como "System.InvalidOperationException: o cabeçalho fornecido não foi encontrado".

Devido ao comportamento do HttpClient do framework, , se o tempo limite do upload expirar, uma TaskCanceledException será gerada. Se essa exceção aparecer, aumente manualmente a propriedade Timeout em o 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");