Carica contenuti multimediali

Diversi metodi API supportano il caricamento di contenuti multimediali oltre a un corpo normale. In questo caso, il metodo di richiesta normale viene sovraccaricato per ottenere Stream per caricare.

Panoramica

Per qualsiasi Stream che vuoi caricare, devi utilizzare il caricamento media ripristinabile, che consente di caricare gli stream in blocchi più piccoli. Questa opzione è particolarmente utile se stai trasferendo file di grandi dimensioni e la probabilità di un'interruzione della rete o di un altro errore di trasmissione è elevata. Può anche ridurre l'utilizzo della larghezza di banda in caso di errori di rete. perché non devi riavviare i caricamenti di file di grandi dimensioni dall'inizio.

ResumableMediaUpload

Il caricamento di contenuti multimediali con possibilità di ripresa è una funzionalità della libreria client .NET dell'API di Google dalla versione 1.2.0-beta. Le librerie specifiche delle API di Google contengono metodi pratici per a interagire con questa funzionalità.

Il protocollo di caricamento dei contenuti multimediali ripristinabili è 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 a blocchi.

La dimensione del chunk predefinita è 10 MB, ma puoi modificarla impostando la proprietà ChunkSize nella richiesta su qualsiasi multiplo di 256 KB. Se in una richiesta viene rilevato un errore del server, viene utilizzato il criterio di backoff esponenziale per inviare nuovamente i byte che non sono stati caricati correttamente. Per impostazione predefinita, il backoff esponenziale è attivo 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 alcune norme di backoff.

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

Assicurati che la posizione dello stream che carichi sia pari a 0, altrimenti riceverai un errore, come "System.ValidOperationException: l'intestazione specificata non è stata trovata."

Tieni presente che, a causa del comportamento dell'elemento HttpClient del framework, se il caricamento scade, viene restituito un TaskCanceledException. Se visualizzi questa eccezione, ti consigliamo di aumentare manualmente la proprietà Timeout in al 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");