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