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