En este documento, se describe cómo usar cargas de contenido multimedia directo y reanudable 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 multimedia reanudable para enviar el archivo fragmentado por fragmentos. Las bibliotecas generadas por la API de Google contienen métodos convenientes para interactuar con la carga de contenido multimedia reanudable.
El protocolo de carga de contenido multimedia reanudable es similar al protocolo de carga de archivos multimedia reanudables que se describe en la documentación de la API de Google Drive.
Diseño de protocolos
En el siguiente diagrama de secuencia, se muestra cómo funciona el protocolo de carga de contenido multimedia reanudable:
Detalles de la implementación
Las clases de interés principales son MediaHttpUploader y MediaHttpProgressListener.
Si los métodos en las bibliotecas generadas específicas del servicio contienen el parámetro mediaUpload
en el documento de descubrimiento, se crea un método conveniente 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 el servicio de descubrimiento de API 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 por el servicio específicas. Por 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 de contenido multimedia directo
La carga de contenido multimedia reanudable está habilitada de forma predeterminada, pero puedes inhabilitarla y usarla en su lugar, por ejemplo, si subes un archivo pequeño. La carga de contenido multimedia directo se introdujo en la versión 1.9.0-beta de la biblioteca cliente de la API de Google para Java.
La carga de contenido multimedia directo sube todo el archivo en una solicitud HTTP, a diferencia del protocolo de carga de medios reanudable, que sube el archivo en varias solicitudes. Realizar una carga directa reduce la cantidad de solicitudes HTTP, pero aumenta la posibilidad de que ocurran fallas (como las de conexión) que ocurren con cargas grandes.
El uso de la carga de contenido multimedia directo es el mismo que el descrito anteriormente para la carga de contenido multimedia reanudable, más la siguiente llamada que le indica a MediaHttpUploader que solo realice cargas directas:
mediaHttpUploader.setDirectUploadEnabled(true);