Fortsetzbare Mediendownloads

Wenn Sie eine große Mediendatei von einem Server herunterladen, verwenden Sie fortsetzbare Mediendownloads, um die Datei Stück für Stück herunterzuladen. Die von der Google API generierten Bibliotheken enthalten praktische Methoden für die Interaktion mit fortsetzbaren Mediendownloads.

Das Protokoll für fortsetzbare Mediendownloads ähnelt dem Protokoll für fortsetzbare Medienuploads, das in der Dokumentation zur Google Drive API beschrieben wird.

Implementierungsdetails

Die wichtigsten Klassen von Interesse sind MediaHttpDownloader und MediaHttpDownloaderProgressListener. Medieninhalte werden in Blöcken heruntergeladen. Die Größe der Chunks ist konfigurierbar. Wenn bei einer Anfrage ein Serverfehler auftritt, wird die Anfrage noch einmal gesendet.

Wenn die Methoden in den dienstspezifischen generierten Bibliotheken den Download im Discovery-Dokument unterstützen, wird für diese Methoden eine geeignete Downloadmethode erstellt, die einen OutputStream annimmt. Weitere Informationen zur Verwendung von Mediendownloads mit dem Google APIs Discovery Service finden Sie unter Mediendownload.

Beispiel:

class CustomProgressListener implements MediaHttpDownloaderProgressListener {
  public void progressChanged(MediaHttpDownloader downloader) {
    switch (downloader.getDownloadState()) {
      case MEDIA_IN_PROGRESS:
        System.out.println(downloader.getProgress());
        break;
      case MEDIA_COMPLETE:
        System.out.println("Download is complete!");
    }
  }
}

OutputStream out = new FileOutputStream("/tmp/driveFile.jpg");

DriveFiles.Get request = drive.files().get(fileId);
request.getMediaHttpDownloader().setProgressListener(new CustomProgressListener());
request.executeMediaAndDownloadTo(out);

Sie können dieses Feature auch ohne dienstspezifische generierte Bibliotheken verwenden. Hier ein Beispiel:

OutputStream out = new FileOutputStream("/tmp/Test.jpg");

MediaHttpDownloader downloader = new MediaHttpDownloader(transport, httpRequestInitializer);
downloader.setProgressListener(new CustomProgressListener());
downloader.download(requestUrl, out);

Direkter Mediendownload

Der fortsetzbare Mediendownload ist standardmäßig aktiviert. Sie können ihn jedoch deaktivieren und stattdessen den direkten Mediendownload verwenden, z. B. wenn Sie eine kleine Datei herunterladen. Der direkte Mediendownload wurde in der 1.9.0-beta der Google API-Clientbibliothek für Java eingeführt.

Beim direkten Mediendownload werden alle Medieninhalte in einer einzigen HTTP-Anfrage heruntergeladen, im Gegensatz zum Protokoll für fortsetzbare Mediendownloads, das in mehreren Anfragen heruntergeladen werden kann. Ein direkter Download reduziert die Anzahl der HTTP-Anfragen, erhöht aber die Wahrscheinlichkeit von Fehlern (z. B. Verbindungsfehler), die bei großen Downloads auftreten können.

Die Verwendung ist dieselbe wie oben beschrieben, plus der folgende Aufruf, der MediaHttpDownloader anweist, direkte Downloads durchzuführen:

mediaHttpDownloader.setDirectDownloadEnabled(true);