Ao fazer o download de um arquivo de mídia grande de um servidor, use o download da mídia recuperável para fazer o download do arquivo bloco por bloco. As bibliotecas geradas pela API do Google contêm métodos de conveniência para interagir com o download de mídia recuperável.
O protocolo de download de mídia recuperável é semelhante ao protocolo de upload de mídia retomado, descrito na documentação da API Google Drive.
Detalhes da implementação
As principais classes de interesse são MediaHttpDownloader e MediaHttpDownloaderProgressListener. O download do conteúdo de mídia é feito em blocos, e o tamanho dele é configurável. Se um erro de servidor for encontrado em uma solicitação, essa solicitação será repetida.
Se os métodos nas bibliotecas geradas por serviços específicos forem compatíveis com o download no documento de descoberta, um método de download conveniente será criado para esses métodos que usam 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 de serviços. Exemplo:
OutputStream out = new FileOutputStream("/tmp/Test.jpg");
MediaHttpDownloader downloader = new MediaHttpDownloader(transport, httpRequestInitializer);
downloader.setProgressListener(new CustomProgressListener());
downloader.download(requestUrl, out);
Download de mídia direto
O download de mídia retomada é ativado por padrão, mas é possível desativá-lo e usar o download de mídia direto, por exemplo, se você estiver fazendo o download de um arquivo pequeno. O download de mídia direta foi introduzido na versão 1.9.0-beta da Biblioteca de cliente da API do Google para Java.
O download de mídia direta faz o download de todo o conteúdo de mídia em uma solicitação HTTP, ao contrário do protocolo de download de mídia recuperável, que pode ser transferido por download em várias solicitações. 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 é igual ao descrito acima, além da chamada a seguir, que instrui o MediaHttpDownloader a fazer downloads diretos:
mediaHttpDownloader.setDirectDownloadEnabled(true);