Subir archivos multimedia

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 para subir.

Descripción general

Para cualquier Stream que desees subir, debes usar la carga reanudable de contenido multimedia, que permite subir las 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 de 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, ya que no necesitas reiniciar las cargas de archivos grandes desde el principio.

ResumableMediaUpload

La carga reanudable de medios 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 contenido multimedia reanudable se describe, por ejemplo, en la página de carga de contenido multimedia para la API de Drive. La clase de interés principal 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 como un múltiplo de 256 KB. Si se encuentra un error de servidor en una solicitud, la política de retirada exponencial se usa para reenviar los bytes que no se subieron de forma correcta. De forma predeterminada, la retirada exponencial está habilitada para cada solicitud de cliente. Puedes cambiar el comportamiento predeterminado cuando creas un nuevo objeto de servicio si cambias la propiedad DefaultExponentialBackOffPolicy en BaseClientService.Initializer o si configuras la propiedad HttpClientInitializer en tu propia implementación de IConfigurableHttpClientInitializer que agregue una política de retirada.

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 convenientes. Esos métodos toman un elemento Stream para subir y su tipo de contenido como parámetros.

Asegúrate de que la posición de la transmisión que subas sea 0. De lo contrario, recibirás un mensaje de error, como “System.InvalidOperationException: The provided header was not found”.

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 de forma manual la propiedad Timeout en el cliente que usa tu objeto de servicio.

Código de ejemplo

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