Carica contenuti multimediali

Oltre al corpo del testo standard, esistono diversi metodi dell'API che supportano il caricamento di contenuti multimediali. In questo caso, il metodo di richiesta normale viene sovraccaricato per ottenere Stream per caricare.

Panoramica

Per tutti i Stream che vuoi caricare, devi utilizzare ripristinabili che consente il caricamento di flussi di dati in blocchi più piccoli. Ciò è particolarmente utile se devi trasferire file di grandi dimensioni, e la probabilità che si verifichino interruzioni di rete o altre trasmissioni un errore è elevato. 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 ripristinabili è una funzionalità della libreria client .NET delle 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 in blocchi.

La dimensione predefinita del blocco è 10 MB, ma puoi modificarla impostando la proprietà ChunkSize della richiesta su un multiplo qualsiasi di 256 kB. Se si verifica un errore del server in una richiesta, il backoff esponenziale viene utilizzato per inviare di nuovo 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 Proprietà DefaultExponentialBackOffPolicy su BaseClientService.Initializer e/o l'impostazione HttpClientInitializer alla tua implementazione di IConfigurableHttpClientInitializer che aggiunge un criterio di backoff.

Vengono identificati i metodi che supportano il caricamento di contenuti multimediali nella documentazione di riferimento per la documentazione specifica dell'API. Per questi metodi dell'API, Upload e Sono stati aggiunti UploadAsync metodi. 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 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");