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