Varios métodos de API admiten la carga de contenido multimedia, además de un cuerpo normal.
En ese caso, el método de solicitud normal se sobrecarga para obtener un Stream
adicional que se subirá.
Descripción general
Para cualquier Stream
que desees subir, debes usar la carga de contenido multimedia reanudable, que permite que las transmisiones se suban en fragmentos más pequeños.
Esto es especialmente útil si transfieres archivos grandes y la probabilidad de una interrupción de red o algún otro error de transmisión es alta.
También puede reducir el uso de ancho de banda en caso de fallas en la red.
porque no hace falta que reinicies
las cargas de archivos grandes desde el principio.
ResumableMediaUpload
La carga de contenido multimedia reanudable es una función de la biblioteca cliente de .NET de la API de Google desde la versión 1.2.0-beta. Las bibliotecas específicas de la API de Google contienen métodos convenientes para interactuar con esta función.
El protocolo de carga de archivos multimedia reanudable se describe, por ejemplo, en el
página de carga de contenido multimedia para la API de Drive.
La clase principal de interés es ResumableUpload
.
En esta implementación, el contenido multimedia se sube en fragmentos.
El tamaño de fragmento predeterminado es de 10 MB, pero puedes cambiarlo si configuras la propiedad ChunkSize
en la solicitud a cualquier múltiplo de 256 KB.
Si se encuentra un error de servidor en una solicitud, la retirada exponencial
se usa para reenviar los bytes que no se subieron correctamente.
De forma predeterminada, la retirada exponencial está habilitada para cada solicitud del cliente.
Puedes cambiar el comportamiento predeterminado cuando construyes un objeto de servicio nuevo. Para ello, cambia la propiedad DefaultExponentialBackOffPolicy
en BaseClientService.Initializer
o configura la propiedad HttpClientInitializer
en tu propia implementación de IConfigurableHttpClientInitializer
que agregue alguna política de tiempo de espera.
Los métodos que admiten la carga de contenido multimedia se identifican en la documentación de referencia de la documentación específica de la API.
Para estos métodos de API, se agregan los métodos Upload
y UploadAsync
de conveniencia.
Esos métodos toman un objeto Stream
para subir y su tipo de contenido como parámetros.
Asegúrate de que la posición de la transmisión continua que subes sea 0. De lo contrario, recibirás un error, como el siguiente: “System.InvalidOperationException: No se encontró el encabezado proporcionado”.
Ten en cuenta que, debido al comportamiento de la clase HttpClient
del framework, si se agota el tiempo de espera de la carga, se genera una TaskCanceledException
.
Si ves esta excepción, considera aumentar manualmente la propiedad Timeout
en el cliente que usa tu objeto de servicio.
Código de muestra
// 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");