Caricamenti di contenuti multimediali diretti e ripristinabili

Questo documento descrive come utilizzare i caricamenti multimediali diretti e ripristinabili con la libreria client delle API di Google per Java.

Caricamento di elementi multimediali ripristinabili

Quando carichi su un server un file multimediale di grandi dimensioni, utilizza il caricamento di elementi multimediali ripristinabili per inviare il blocco di file per blocco. Le librerie generate dall'API di Google contengono metodi pratici per interagire con il caricamento di contenuti multimediali ripristinabili.

Il protocollo di caricamento di contenuti multimediali ripristinabile è simile al protocollo di caricamento multimediale ripristinabile descritto nella documentazione dell'API Google Drive.

Progettazione del protocollo

Il seguente diagramma di sequenza mostra come funziona il protocollo di caricamento di contenuti multimediali ripristinabili:
Diagramma di sequenza che mostra il modo in cui le richieste e le risposte si spostano tra client e server.

Dettagli di implementazione

Le classi principali di interesse sono MediaHttpUploader e MediaHttpProgressListener.

Se i metodi nelle librerie generate specifiche per il servizio contengono il parametro mediaUpload nel documento di rilevamento, per questi metodi viene creato un metodo di convenienza che prende come parametro InputStreamContent. Per ulteriori informazioni sull'utilizzo del caricamento di contenuti multimediali con il servizio di rilevamento delle API di Google, consulta Caricamento di contenuti multimediali.

Ad esempio, il metodo insert dell'API Drive supporta mediaUpload e puoi utilizzare il seguente codice per caricare un file:

class CustomProgressListener implements MediaHttpUploaderProgressListener {
  public void progressChanged(MediaHttpUploader uploader) throws IOException {
    switch (uploader.getUploadState()) {
      case INITIATION_STARTED:
        System.out.println("Initiation has started!");
        break;
      case INITIATION_COMPLETE:
        System.out.println("Initiation is complete!");
        break;
      case MEDIA_IN_PROGRESS:
        System.out.println(uploader.getProgress());
        break;
      case MEDIA_COMPLETE:
        System.out.println("Upload is complete!");
    }
  }
}

File mediaFile = new File("/tmp/driveFile.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

Drive.Files.Insert request = drive.files().insert(fileMetadata, mediaContent);
request.getMediaHttpUploader().setProgressListener(new CustomProgressListener());
request.execute();

Puoi anche utilizzare la funzionalità di caricamento di contenuti multimediali ripristinabili senza le librerie generate specifiche per il servizio. Ecco un esempio:

File mediaFile = new File("/tmp/Test.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, transport, httpRequestInitializer); uploader.setProgressListener(new CustomProgressListener()); HttpResponse response = uploader.upload(requestUrl); if (!response.isSuccessStatusCode()) { throw GoogleJsonResponseException(jsonFactory, response); }

Caricamento diretto di contenuti multimediali

Il caricamento di contenuti multimediali ripristinabili è abilitato per impostazione predefinita, ma puoi disattivarlo e utilizzare il caricamento diretto dei contenuti multimediali, ad esempio se stai caricando un file di piccole dimensioni. Il caricamento diretto dei contenuti multimediali è stato introdotto nella versione 1.9.0-beta della libreria client dell'API di Google per Java.

Il caricamento diretto dei contenuti multimediali carica l'intero file in un'unica richiesta HTTP, a differenza del protocollo di caricamento multimediale ripristinabile, che carica il file in più richieste. Eseguire un caricamento diretto riduce il numero di richieste HTTP, ma aumenta la probabilità di errori (ad esempio errori di connessione) che possono verificarsi con caricamenti di grandi dimensioni.

L'utilizzo per il caricamento diretto di contenuti multimediali è lo stesso descritto sopra per il caricamento di contenuti multimediali ripristinabili, con in più la seguente chiamata che indica a MediaHttpUploader di eseguire solo caricamenti diretti:

mediaHttpUploader.setDirectUploadEnabled(true);