Subir archivos multimedia

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Varios métodos de la API admiten la carga de contenido multimedia además de un cuerpo normal. En ese caso, el método de solicitud regular se sobrecarga para obtener un Stream adicional para subir.

Descripción general

Para cualquier Stream que desees subir, debes usar la carga de medios reanudable, que permite que las cargas se suban en fragmentos más pequeños. Esto es especialmente útil si transfieres archivos grandes y si la probabilidad de una interrupción de red o algún otro error de transmisión es alto. También puede reducir el uso del ancho de banda en caso de fallas de red, ya que no es necesario reiniciar grandes cargas de archivos desde el principio.

Carga reanudable de medios

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 medios reanudables se describe, por ejemplo, en la página de carga de medios 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 predeterminado del fragmento es de 10 MB, pero puedes cambiarlo si estableces la propiedad ChunkSize en la solicitud en cualquier múltiplo de 256 KB. Si se encuentra un error de servidor en una solicitud, se usa la política de retirada exponencial para volver a enviar los bytes que no se subieron de forma correcta. 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 la propiedad DefaultExponentialBackOffPolicy en BaseClientService.Initializer o configurando la propiedad HttpClientInitializer en tu propia implementación de IConfigurableHttpClientInitializer que agrega política de retirada.

Los métodos que admiten la carga de contenido multimedia se identifican en la documentación de referencia para la documentación específica de la API. Para estos métodos de API, se agregan los métodos convenientes Upload y UploadAsync. Esos métodos toman un 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 error, como "System.InvalidOperationException: The provided header was not found".

Ten en cuenta que, debido al comportamiento de la clase HttpClient del marco de trabajo, 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");