問(wèn)題描述
如何查看使用 GoogleDrive API 的上傳進(jìn)度?
How to check the progress of an upload that use GoogleDrive API?
service.files().insert(body, mediaContent).execute(); 只返回一個(gè)文件我們可以檢查文件是否已完全上傳.
The service.files().insert(body, mediaContent).execute(); only return a file which we can check if the file has upload completely.
但我需要實(shí)時(shí)檢查進(jìn)度(至少每秒左右),無(wú)論如何要這樣做?
But I need to check the progress in real time(at least each second or so), anyway to do it?
對(duì)于下載部分,我認(rèn)為我們可以手動(dòng)比較我們已經(jīng)從輸入流中讀取的字節(jié)數(shù)與總文件大小,然后計(jì)算當(dāng)前進(jìn)度.
And for download part, I think we can manually compare how many bytes we have already read from the inputstream to the total filesize, then calculate the current progress.
但這是正確的方法嗎?還是有其他更好的檢查進(jìn)度的方法?
But is this the correct way? Or there is other better way of checking progress?
private void saveFileToDrive() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
// File's binary content
java.io.File fileContent = new java.io.File(fileUri.getPath());
FileContent mediaContent = new FileContent("image/jpeg", fileContent);
// File's metadata.
File body = new File();
body.setTitle(fileContent.getName());
body.setMimeType("image/jpeg");
File file = service.files().insert(body, mediaContent).execute();
if (file != null) {
showToast("Photo uploaded: " + file.getTitle());
//startCameraIntent();
}
} catch (UserRecoverableAuthIOException e) {
startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
} catch (IOException e) {
e.printStackTrace();
}
}
});
t.start();
}
已使用此代碼 http://code.google.com/p/google-api-java-client/source/browse/drive-cmdline-sample/src/main/java/com/google/api/services/samples/drive/cmdline/DriveSample.java?repo=samples&name=基于-1.12&r=08555cd2a27be66dc97505e15c60853f47d84b5a
如果我使用可恢復(fù)上傳,我現(xiàn)在能夠取得一些進(jìn)展,我將塊大小設(shè)置為 1MB.但是現(xiàn)在有兩個(gè)問(wèn)題.
I am able to get some progress now if I am using resumable upload, I set chunksize to 1MB. BUT there are 2 problems now.
1) 可恢復(fù)上傳比單次上傳慢很多,因?yàn)橹虚g會(huì)停很多次,每次只發(fā)送1MB.
如果我將 chunksize 設(shè)置為更高,那么對(duì)于較小的文件,它根本不會(huì)顯示進(jìn)度.
所以,可恢復(fù)上傳的進(jìn)展并不是我真正想要的.我想要單次上傳的進(jìn)度.
1) The resumable upload is much slower than single upload, because it stop many times in between, only sending 1MB each time.
If I set chunksize to higher, then it wont show progress at all for smaller file.
So, progress in resumable upload is not what I actually want. I want progress in single upload.
2) 如果我將塊大小設(shè)置為大約 1MB,對(duì)于一個(gè)正常的 10MB 文件,我的上傳總是失敗約為 70%.
如果我將 chunksize 設(shè)置為 10MB,那么它會(huì)成功,但我不會(huì)看到任何進(jìn)展.
2) If I set chunksize about 1MB, my upload always fail at about 70% for a normal 10MB file.
If I set chunksize to 10MB then it will success, but I wont see any progress.
Drive.Files.Insert insert = service.files().insert(body, mediaContent);
MediaHttpUploader uploader = insert.getMediaHttpUploader();
uploader.setDirectUploadEnabled(false);
uploader.setChunkSize(10*1024*1024); // previously I am using 1000000 thats why it won't work
uploader.setProgressListener(new FileUploadProgressListener());
com.google.api.services.drive.model.File f = insert.execute();
LogCat 錯(cuò)誤:
11-27 19:23:26.927: D/FileUploadProgressListener(11527): Upload is In Progress: 0.5235538030501893
11-27 19:23:33.692: D/FileUploadProgressListener(11527): Upload is In Progress: 0.56095050326806
11-27 19:23:38.294: D/FileUploadProgressListener(11527): Upload is In Progress: 0.5983472034859306
11-27 19:23:50.583: D/FileUploadProgressListener(11527): Upload is In Progress: 0.6357439037038013
11-27 19:23:55.091: D/FileUploadProgressListener(11527): Upload is In Progress: 0.673140603921672
11-27 19:24:05.130: D/FileUploadProgressListener(11527): Upload is In Progress: 0.7105373041395426
11-27 19:24:17.005: D/FileUploadProgressListener(11527): Upload is In Progress: 0.7479340043574133
11-27 19:24:28.888: D/FileUploadProgressListener(11527): Upload is In Progress: 0.785330704575284
11-27 19:24:28.896: W/HttpTransport(11527): exception thrown while executing request
11-27 19:24:28.896: W/HttpTransport(11527): java.io.IOException: unexpected end of stream
11-27 19:24:28.896: W/HttpTransport(11527): at libcore.net.http.FixedLengthOutputStream.close(FixedLengthOutputStream.java:58)
11-27 19:24:28.896: W/HttpTransport(11527): at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:88)
11-27 19:24:28.896: W/HttpTransport(11527): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:980)
11-27 19:24:28.896: W/HttpTransport(11527): at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:293)
11-27 19:24:28.896: W/HttpTransport(11527): at com.google.api.services.drive.Drive$Files$Insert.executeUnparsed(Drive.java:309)
11-27 19:24:28.896: W/HttpTransport(11527): at com.google.api.services.drive.Drive$Files$Insert.execute(Drive.java:331)
推薦答案
進(jìn)度監(jiān)聽(tīng)器:
private class FileUploadProgressListener implements MediaHttpUploaderProgressListener {
private String mFileUploadedName;
public FileUploadProgressListener(String fileName) {
mFileUploadedName = fileName;
}
@Override
public void progressChanged(MediaHttpUploader mediaHttpUploader) throws IOException {
if (mediaHttpUploader == null) return;
switch (mediaHttpUploader.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:
double percent = mediaHttpUploader.getProgress() * 100;
if (Ln.DEBUG) {
Log.d(Ln.TAG, "Upload to Dropbox: " + mFileUploadedName + " - " + String.valueOf(percent) + "%");
}
notif.setProgress(percent, mFileUploadedName).fire();
break;
case MEDIA_COMPLETE:
//System.out.println("Upload is complete!");
}
}
}
更多信息在這里:https://code.google.com/p/google-api-java-client/維基/媒體上傳
直接媒體上傳將在一個(gè)請(qǐng)求中上傳整個(gè)媒體內(nèi)容,而不是可以在多個(gè)請(qǐng)求中上傳的可恢復(fù)媒體上傳協(xié)議.
Direct media upload will upload the whole media content in one request as opposed to the resumable media upload protocol that could upload in multiple requests.
直接上傳會(huì)減少 HTTP 請(qǐng)求的數(shù)量,但增加失敗的變化與大型媒體上傳(例如連接失敗).
Doing a direct upload reduces the number of HTTP requests but increases the change of failures with a large media upload (e.g. connection failure).
由于庫(kù)的架構(gòu),您必須在塊和進(jìn)度或沒(méi)有進(jìn)度的一步之間進(jìn)行選擇.最小的塊大小應(yīng)該可以改善事情.可能的更小的塊:
Because of the architecture of the library, you have to choose between chunk and progress OR one step without progress. The smallest Chunk size should improve things. Smaller chunk possible:
setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)
希望對(duì)你有幫助!
這篇關(guān)于檢查上傳和進(jìn)度下載(適用于 Android 或 Java 的 Google Drive API)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!