Importations de médias directes et avec reprise

Ce document explique comment utiliser des importations de médias directes et avec reprise avec la bibliothèque cliente des API Google pour Java.

Importation d'éléments multimédias avec reprise

Lorsque vous importez un fichier multimédia volumineux sur un serveur, utilisez l'importation de médias avec reprise pour envoyer le fichier fragment par bloc. Les bibliothèques générées par l'API Google contiennent des méthodes pratiques permettant d'interagir avec l'importation d'éléments multimédias avec reprise.

Ce protocole est semblable à celui décrit dans la documentation de l'API Google Drive.

Conception du protocole

Le schéma de séquence suivant montre le fonctionnement du protocole d'importation de médias avec reprise :
Schéma séquentiel illustrant la circulation des requêtes et des réponses entre le client et le serveur

Détails de mise en œuvre

Les principales catégories d'intérêt sont MediaHttpUploader et MediaHttpProgressListener.

Si les méthodes des bibliothèques générées pour un service spécifique contiennent le paramètre mediaUpload dans le document de découverte, une méthode pratique, qui utilise InputStreamContent comme paramètre, est créée pour ces méthodes. (Pour en savoir plus sur l'utilisation de l'importation de fichiers multimédias avec le service de découverte des API Google, consultez Importation de fichiers multimédias.)

Par exemple, la méthode insert de l'API Drive est compatible avec mediaUpload. Vous pouvez utiliser le code suivant pour importer un fichier:

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

Vous pouvez également utiliser la fonctionnalité d'importation de fichiers multimédias avec reprise sans les bibliothèques générées spécifiques au service. Voici un exemple :

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

Importation directe de contenu multimédia

L'importation multimédia avec reprise est activée par défaut, mais vous pouvez la désactiver et utiliser l'importation multimédia directe à la place, par exemple si vous importez un petit fichier. L'importation directe de fichiers multimédias a été introduite dans la version 1.9.0-beta de la bibliothèque cliente des API Google pour Java.

L'importation directe de fichiers multimédias importe l'intégralité du fichier dans une seule requête HTTP, contrairement au protocole d'importation multimédia avec reprise, qui importe le fichier dans plusieurs requêtes. Une importation directe réduit le nombre de requêtes HTTP, mais augmente le risque de défaillances (telles que les échecs de connexion) susceptibles de se produire avec des importations volumineuses.

L'utilisation de l'importation directe de contenu multimédia est identique à celle décrite ci-dessus pour l'importation de médias avec reprise, à l'exception de l'appel suivant qui indique à MediaHttpUploader de n'effectuer que des importations directes:

mediaHttpUploader.setDirectUploadEnabled(true);