Ao fazer o download de um arquivo de mídia grande de um servidor, use download de mídia retomável para fazer download do arquivo em cada bloco. A API do Google as bibliotecas geradas contêm métodos de conveniência para interagir com as bibliotecas download de mídia.
O protocolo de download de mídia retomável é semelhante ao upload de mídia retomável protocolo, que é 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 blocos, e o tamanho desses blocos é configurável. Se um erro de servidor for encontrado em uma solicitação, ela será repetida.
Se os métodos nas bibliotecas geradas de serviço específico forem compatíveis com download no documento de descoberta, um método de download conveniente é criado para esses métodos, que leva em uma OutputStream. (Para obter mais informações 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 as 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 direto de mídia
O download de mídia recuperável está ativado por padrão, mas é possível desativá-lo e usá-lo como 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 no 1.9.0-beta da biblioteca de cliente das APIs do Google para Java.
O download de mídia direto faz o download de todo o conteúdo de mídia em uma solicitação HTTP, pois ao contrário do protocolo de download de mídia retomável, que pode fazer o download em vários 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, mais os seguintes que diz MediaHttpDownloader para fazer downloads diretos:
mediaHttpDownloader.setDirectDownloadEnabled(true);