Uploads de mídia diretos e recuperáveis

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

Upload de mídia recuperável

Ao fazer upload de um arquivo de mídia grande para um servidor, use o upload de mídia recuperável para enviar o arquivo bloco por bloco. As bibliotecas geradas pela API do Google contêm métodos de conveniência para interagir com o upload de mídia recuperável.

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

Projeto do protocolo

O diagrama de sequência a seguir mostra como funciona o protocolo de upload de mídia recuperável:
Diagrama de sequência que mostra 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 de serviço contiverem o parâmetro mediaUpload no documento de descoberta, um método de conveniência será criado para esses métodos que usam 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 seguinte código 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 recuperável sem as bibliotecas geradas específicas de serviço. Veja 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 de mídia direto

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

O upload de mídia direta faz upload do arquivo inteiro em uma solicitação HTTP, ao contrário do protocolo de upload de mídia recuperá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 probabilidade de falhas (como falhas de conexão) que podem acontecer com uploads grandes.

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

mediaHttpUploader.setDirectUploadEnabled(true);