Carica contenuti multimediali

Diversi metodi dell'API supportano il caricamento di contenuti multimediali oltre al corpo normale. In questo caso, il metodo di richiesta normale è sovraccarico per ottenere un ulteriore Stream da caricare.

Panoramica

Per ogni elemento Stream da caricare, devi utilizzare il caricamento di contenuti multimediali ripristinabili, che consente di caricare gli stream in blocchi più piccoli. Ciò è particolarmente utile se stai trasferendo file di grandi dimensioni e la probabilità di interruzione della rete o altri errori di trasmissione è elevata. Inoltre, può ridurre l'utilizzo della larghezza di banda in caso di errori di rete, perché non è necessario riavviare il caricamento di file di grandi dimensioni dall'inizio.

ResumableMediaUpload

Resumable Media Upload è una funzionalità della libreria client .NET dell'API di Google dalla versione 1.2.0-beta. Le librerie specifiche dell'API di Google contengono metodi pratici per interagire con questa funzionalità.

Il protocollo di caricamento multimediale ripristinabile è descritto, ad esempio, nella pagina di caricamento dei contenuti multimediali per l'API Drive. La classe principale di interesse è ResumableUpload. In questa implementazione, i contenuti multimediali vengono caricati in blocchi.

Le dimensioni predefinite del blocco sono pari a 10 MB, ma puoi modificarle impostando la proprietà ChunkSize nella richiesta su un multiplo di 256 kB. Se si verifica un errore del server in una richiesta, viene utilizzato il criterio di backoff esponenziale per inviare nuovamente i byte che non sono stati caricati correttamente. Per impostazione predefinita, il backoff esponenziale è abilitato per ogni richiesta del client. Puoi modificare il comportamento predefinito quando crei un nuovo oggetto di servizio modificando la proprietà DefaultExponentialBackOffPolicy su BaseClientService.Initializer e/o impostando la proprietà HttpClientInitializer sulla tua implementazione di IConfigurableHttpClientInitializer che aggiunge alcuni criteri di backoff.

I metodi che supportano il caricamento di contenuti multimediali sono identificati nella documentazione di riferimento della documentazione specifica dell'API. Per questi metodi API vengono aggiunti i metodi Upload e UploadAsync di comodità. Questi metodi richiedono un Stream per il caricamento e il relativo tipo di contenuti come parametri.

Assicurati che la posizione dello stream che carichi sia 0, altrimenti riceverai un errore, come "System.InvalidOperationException: The provided header was not found".

Tieni presente che, a causa del comportamento della classe HttpClient del framework, se il caricamento scade, viene generato un TaskCanceledException. Se vedi questa eccezione, ti consigliamo di aumentare manualmente la proprietà Timeout nel client utilizzato dall'oggetto di servizio.

Codice di esempio

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