Cargas de contenido multimedia reanudables y directas

En este documento, se describe cómo usar cargas de contenido multimedia directas y reanudables con la biblioteca cliente de las APIs de Google para Java.

Carga reanudable de contenido multimedia

Cuando subas un archivo multimedia grande a un servidor, usa la carga reanudable de contenido multimedia para envía el bloque del archivo por fragmento. Las bibliotecas generadas por la API de Google contienen métodos útiles para interactuar con la carga reanudable de medios.

El protocolo de carga de contenido multimedia reanudable es similar al de carga reanudable de archivos multimedia protocolo descrito en la documentación de la API de Google Drive.

Diseño de protocolos

En el siguiente diagrama de secuencias, se muestra cómo funciona el protocolo de carga de contenido multimedia reanudable:
Diagrama de secuencias que muestra cómo se mueven las solicitudes y las respuestas entre el cliente y el servidor.

Detalles de implementación

Las principales clases de interés son MediaHttpUploader y MediaHttpProgressListener.

Si los métodos de las bibliotecas generadas específicas del servicio contienen el mediaUpload en el documento de descubrimiento, se crea un método de conveniencia para estos métodos que toma un InputStreamContent como parámetro. Para obtener más información sobre cómo usar la carga de contenido multimedia con las APIs de Google, Discovery Service, consulte Carga de medios).

Por ejemplo, el método insert de la API de Drive admite mediaUpload, y puedes usar el siguiente código para subir un archivo:

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

También puedes usar la función de carga reanudable de contenido multimedia sin la función de carga las bibliotecas generadas. Aquí hay un ejemplo:

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

Carga directa de contenido multimedia

La carga reanudable de archivos multimedia está habilitada de forma predeterminada, pero puedes inhabilitarla y usar carga directa de contenido multimedia, por ejemplo, si está subiendo un archivo pequeño. Directa La carga de contenido multimedia se introdujo en la versión 1.9.0-beta. de la biblioteca cliente de la API de Google para Java.

La carga directa de medios sube todo el archivo en una solicitud HTTP, el protocolo de carga de medios reanudable, que sube el archivo en varias solicitudes. Hacer una carga directa reduce la cantidad de solicitudes HTTP, pero aumenta de fallas (como fallas en la conexión), que pueden ocurrir con cargas.

El uso de la carga directa de contenido multimedia es el mismo que el descrito anteriormente para carga reanudable de contenido multimedia, más la siguiente llamada que indica a MediaHttpUploader para realizar únicamente cargas directas:

mediaHttpUploader.setDirectUploadEnabled(true);