Ao fazer o download de um arquivo de mídia grande de um servidor, use o download de mídia retomável para transferir o arquivo fragmentado. As bibliotecas geradas pela API do Google contêm métodos convenientes para interagir com o download de mídia retomável.
O protocolo de download de mídia retomável é semelhante ao protocolo de upload de mídia retomável, descrito na documentação da API Google Drive.
Detalhes da implementação
As principais classes de interesse são MediaHttpDownloader e MediaHttpDownloaderProgressListener. O conteúdo de mídia é baixado em partes, e o tamanho do bloco é configurável. Se um erro de servidor for encontrado em uma solicitação, ela será repetida.
Se os métodos nas bibliotecas geradas específicas do serviço permitirem o download no documento de descoberta, um método de download conveniente será criado para esses métodos e receberá um OutputStream. Para saber mais sobre como usar o download de mídia com o serviço de descoberta de APIs do Google, consulte Download de mídia.
Exemplo:
class CustomProgressListener implements MediaHttpDownloaderProgressListener {
public void progressChanged(MediaHttpDownloader downloader) {
switch (downloader.getDownloadState()) {
case MEDIA_IN_PROGRESS:
System.out.println(downloader.getProgress());
break;
case MEDIA_COMPLETE:
System.out.println("Download is complete!");
}
}
}
OutputStream out = new FileOutputStream("/tmp/driveFile.jpg");
DriveFiles.Get request = drive.files().get(fileId);
request.getMediaHttpDownloader().setProgressListener(new CustomProgressListener());
request.executeMediaAndDownloadTo(out);
Também é possível usar esse recurso sem bibliotecas geradas específicas do serviço. Confira um exemplo:
OutputStream out = new FileOutputStream("/tmp/Test.jpg");
MediaHttpDownloader downloader = new MediaHttpDownloader(transport, httpRequestInitializer);
downloader.setProgressListener(new CustomProgressListener());
downloader.download(requestUrl, out);
Download direto de mídia
O download de mídia retomável é ativado por padrão, mas é possível desativá-lo e usar o download direto de mídia, por exemplo, se você estiver fazendo o download de um arquivo pequeno. O download direto de mídia foi introduzido na versão 1.9.0-beta da biblioteca de cliente da API do Google para Java.
O download direto de mídia faz o download de todo o conteúdo de mídia em uma solicitação HTTP, em vez do protocolo de download de mídia retomável, que pode ser transferido em várias solicitações. Fazer um download direto reduz o número de solicitações HTTP, mas aumenta a chance de falhas (como falhas de conexão) que podem acontecer com downloads grandes.
O uso é o mesmo descrito acima, além da seguinte chamada que instrui o MediaHttpDownloader a fazer downloads diretos:
mediaHttpDownloader.setDirectDownloadEnabled(true);