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 la API de Google para Java.

Carga de contenido multimedia reanudable

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

El protocolo de carga de contenido multimedia reanudable es similar al que se describe en la documentación de la API de Google Drive.

Diseño de protocolo

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 respuestas entre el cliente y el servidor.

Detalles de la implementación

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

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

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 de contenido multimedia reanudable sin las bibliotecas generadas específicas del servicio. A continuación, se muestra 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 contenido multimedia está habilitada de forma predeterminada, pero puedes inhabilitarla y usar la carga directa de contenido multimedia, por ejemplo, si subes un archivo pequeño. La carga directa 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 contenido multimedia sube el archivo completo en una solicitud HTTP, a diferencia del protocolo de carga reanudable de contenido multimedia, que sube el archivo en varias solicitudes. Hacer una carga directa reduce la cantidad de solicitudes HTTP, pero aumenta la probabilidad de fallas (como fallas de conexión) que pueden ocurrir con cargas grandes.

El uso de la carga directa de contenido multimedia es el mismo que se describió anteriormente para la carga reanudable de contenido multimedia, además de la siguiente llamada que le indica a MediaHttpUploader que solo realice cargas directas:

mediaHttpUploader.setDirectUploadEnabled(true);