Subir archivos multimedia

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