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