Uploads direkter und wiederaufnehmbarer Medien

In diesem Dokument wird beschrieben, wie direkte und fortsetzbare Medienuploads mit der Google API-Clientbibliothek für Java verwendet werden.

Fortsetzbarer Medien-Upload

Wenn Sie eine große Mediendatei auf einen Server hochladen, verwenden Sie den fortsetzbaren Medien-Upload, um die Datei Stück für Stück zu senden. Die von der Google API generierten Bibliotheken enthalten praktische Methoden für die Interaktion mit fortsetzbaren Medienuploads.

Das Protokoll für fortsetzbare Medienuploads ähnelt dem Protokoll zum Hochladen von fortsetzbaren Medien, das in der Dokumentation zur Google Drive API beschrieben wird.

Protokolldesign

Das folgende Sequenzdiagramm zeigt, wie das Protokoll für fortsetzbare Medienuploads funktioniert:
Sequenzdiagramm, das zeigt, wie sich Anfragen und Antworten zwischen Client und Server bewegen

Implementierungsdetails

Die wichtigsten Klassen von Interesse sind MediaHttpUploader und MediaHttpProgressListener.

Wenn Methoden in den dienstspezifischen generierten Bibliotheken den Parameter mediaUpload im Discovery-Dokument enthalten, wird für diese Methoden eine einfache Methode erstellt, die InputStreamContent als Parameter verwendet. Weitere Informationen zur Verwendung des Medien-Uploads mit dem Discovery Service der Google APIs finden Sie unter Medien-Upload.

Beispielsweise unterstützt die Methode insert der Drive API mediaUpload und Sie können den folgenden Code verwenden, um eine Datei hochzuladen:

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

Sie können die Funktion zum Hochladen von fortsetzbaren Medien auch ohne die dienstspezifischen generierten Bibliotheken verwenden. Hier ein Beispiel:

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

Direkter Medienupload

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

Beim direkten Medienupload wird die gesamte Datei in einer HTTP-Anfrage hochgeladen – im Gegensatz zum Protokoll für fortsetzbare Medienuploads, bei dem die Datei in mehreren Anfragen hochgeladen wird. Ein direkter Upload reduziert die Anzahl der HTTP-Anfragen, erhöht aber die Wahrscheinlichkeit von Fehlern (z. B. Verbindungsfehler), die bei großen Uploads auftreten können.

Die Verwendung für den direkten Medien-Upload entspricht der oben für fortsetzbaren Medien-Upload sowie die folgende Verwendung des folgenden Aufrufs, der MediaHttpUploader anweist, nur direkte Uploads vorzunehmen:

mediaHttpUploader.setDirectUploadEnabled(true);