Varios métodos de la API admiten la carga de contenido multimedia, además de un cuerpo común.
En ese caso, el método de solicitud regular se sobrecarga para obtener una respuesta
Stream
para subir.
Descripción general
Para cada Stream
que quieras subir, debes usar reglas
carga de archivos multimedia, que permite subir transmisiones en fragmentos más pequeños.
Esto es muy útil si transfieres archivos grandes
y la probabilidad de una interrupción de la red o algún otro tipo de transmisión
la falla 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 reanudable de medios ha sido una función de la biblioteca cliente .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 que interactúan 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 principal clase de interés es
ResumableUpload
En esta implementación, el contenido multimedia se sube en fragmentos.
El tamaño predeterminado del bloque es de 10 MB, pero puedes cambiarlo
Configurando la propiedad ChunkSize
en la solicitud en 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 creas
un objeto de servicio nuevo cambiando
Propiedad DefaultExponentialBackOffPolicy
en BaseClientService.Initializer
y/o establecer la
.
HttpClientInitializer
a tu propia implementación de IConfigurableHttpClientInitializer
que agregue alguna política de retirada.
Se identifican los métodos que admiten la carga de contenido multimedia.
en la documentación de referencia para la documentación específica de la API.
Para estos métodos de API, resulta conveniente Upload
y
Se agregaron métodos UploadAsync
.
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 HttpClient
del framework
Si se agota el tiempo de espera de la carga, se arroja 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");