如何使用 REST API 获取从 google 驱动器下载文件的进度?
How to get progress of a file being downloaded from google drive using REST API?
我正在使用 this method 从 Google 驱动器下载文件。
我的代码:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
driveService.files().export(remoteFiles[0].getId(),"text/plain").executeMediaAndDownloadTo(byteArrayOutputStream);
FileOutputStream fileOutputStream= new FileOutputStream(new File(downloadsDirectory,remoteFiles[0].getName()));
byteArrayOutputStream.writeTo(fileOutputStream);
byteArrayOutputStream.flush();
byteArrayOutputStream.close();
fileOutputStream.close();
有没有办法获取文件下载进度?
我能想到的第一件事是将 FileOutputStream 包装在自定义 Stream 中,该 Stream 覆盖 write 方法以另外通知侦听器写入的字节数。像这样:
public class ProgressOutputStream extends OutputStream {
IProgressListener _listener;
OutputStream _stream;
int _position;
public ProgressOutputStream(OutputStream stream, IProgressListener listener) {
_stream = stream;
_listener = listener;
}
@Override
public void write(byte[] b, int offset, int len) {
_stream.write(b, offset, len);
_position += len;
reportProgress();
}
private void reportProgress() {
_listener.onProgressUpdate(_position);
}
@Override
public void write(int b) {
_stream.write(b);
}
}
interface IProgressListener {
void onProgressUpdate(int progress);
}
剩下的就是知道文件的大小,以便您可以在进度侦听器中以百分比计算进度。
回答我自己的问题,发现它 on this page。
//custom listener for download progress
class DownloadProgressListener implements MediaHttpDownloaderProgressListener{
@Override
public void progressChanged(MediaHttpDownloader downloader) throws IOException {
switch (downloader.getDownloadState()){
//Called when file is still downloading
//ONLY CALLED AFTER A CHUNK HAS DOWNLOADED,SO SET APPROPRIATE CHUNK SIZE
case MEDIA_IN_PROGRESS:
//Add code for showing progress
break;
//Called after download is complete
case MEDIA_COMPLETE:
//Add code for download completion
break;
}
}
}
//create a Drive.Files.Get object,
//set a ProgressListener
//change chunksize(default chunksize seems absurdly high)
Drive.Files.Get request = driveService.files().get(remoteFiles[0].getId());
request.getMediaHttpDownloader().setProgressListener(new DownloadProgressListener()).setChunkSize(1000000);
request.executeMediaAndDownloadTo(outputStream);
我正在使用 this method 从 Google 驱动器下载文件。
我的代码:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
driveService.files().export(remoteFiles[0].getId(),"text/plain").executeMediaAndDownloadTo(byteArrayOutputStream);
FileOutputStream fileOutputStream= new FileOutputStream(new File(downloadsDirectory,remoteFiles[0].getName()));
byteArrayOutputStream.writeTo(fileOutputStream);
byteArrayOutputStream.flush();
byteArrayOutputStream.close();
fileOutputStream.close();
有没有办法获取文件下载进度?
我能想到的第一件事是将 FileOutputStream 包装在自定义 Stream 中,该 Stream 覆盖 write 方法以另外通知侦听器写入的字节数。像这样:
public class ProgressOutputStream extends OutputStream {
IProgressListener _listener;
OutputStream _stream;
int _position;
public ProgressOutputStream(OutputStream stream, IProgressListener listener) {
_stream = stream;
_listener = listener;
}
@Override
public void write(byte[] b, int offset, int len) {
_stream.write(b, offset, len);
_position += len;
reportProgress();
}
private void reportProgress() {
_listener.onProgressUpdate(_position);
}
@Override
public void write(int b) {
_stream.write(b);
}
}
interface IProgressListener {
void onProgressUpdate(int progress);
}
剩下的就是知道文件的大小,以便您可以在进度侦听器中以百分比计算进度。
回答我自己的问题,发现它 on this page。
//custom listener for download progress
class DownloadProgressListener implements MediaHttpDownloaderProgressListener{
@Override
public void progressChanged(MediaHttpDownloader downloader) throws IOException {
switch (downloader.getDownloadState()){
//Called when file is still downloading
//ONLY CALLED AFTER A CHUNK HAS DOWNLOADED,SO SET APPROPRIATE CHUNK SIZE
case MEDIA_IN_PROGRESS:
//Add code for showing progress
break;
//Called after download is complete
case MEDIA_COMPLETE:
//Add code for download completion
break;
}
}
}
//create a Drive.Files.Get object,
//set a ProgressListener
//change chunksize(default chunksize seems absurdly high)
Drive.Files.Get request = driveService.files().get(remoteFiles[0].getId());
request.getMediaHttpDownloader().setProgressListener(new DownloadProgressListener()).setChunkSize(1000000);
request.executeMediaAndDownloadTo(outputStream);