Uploads de mídia diretos e retomáveis

Este documento descreve como usar uploads de mídia diretos e retomáveis com a biblioteca de cliente da API do Google para Java.

Upload de mídia retomável

Ao fazer o upload de um arquivo de mídia grande para um servidor, use o upload de mídia retomável para enviar o arquivo fragmentado. As bibliotecas geradas pela API do Google contêm métodos práticos para interagir com o upload de mídia retomável.

O protocolo de upload de mídia retomável é semelhante ao protocolo descrito na documentação da API Google Drive.

Design de protocolo

O diagrama de sequência a seguir mostra como funciona o protocolo de upload de mídia retomável:
Diagrama de sequência mostrando como as solicitações e respostas se movem entre o cliente e o servidor.

Detalhes da implementação

As principais classes de interesse são MediaHttpUploader e MediaHttpProgressListener.

Se os métodos nas bibliotecas geradas específicas do serviço contiverem o parâmetro mediaUpload no documento de descoberta, um método de conveniência será criado para esses métodos e receberá um InputStreamContent como parâmetro. Para saber mais sobre como usar o upload de mídia com o serviço de descoberta de APIs do Google, consulte Upload de mídia.

Por exemplo, o método insert da API Drive é compatível com mediaUpload, e você pode usar o código a seguir para fazer upload de um arquivo:

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

Também é possível usar o recurso de upload de mídia retomável sem as bibliotecas geradas específicas do serviço. Confira um exemplo:

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

Upload direto de mídia

O upload de mídia retomável é ativado por padrão, mas é possível desativá-lo e usar o upload de mídia direto, por exemplo, se você estiver enviando um arquivo pequeno. O upload de mídia direto foi introduzido na versão 1.9.0-beta da biblioteca de cliente da API do Google para Java.

O upload direto de mídia faz upload de todo o arquivo em uma solicitação HTTP, ao contrário do protocolo de upload de mídia retomável, que faz upload do arquivo em várias solicitações. Fazer um upload direto reduz o número de solicitações HTTP, mas aumenta a chance de falhas (como falhas de conexão) que podem acontecer com uploads grandes.

O uso para o upload de mídia direto é o mesmo descrito acima para uploads de mídia retomáveis, além da chamada a seguir que instrui o MediaHttpUploader a fazer apenas uploads diretos:

mediaHttpUploader.setDirectUploadEnabled(true);