[英]Google Drive api Java - is my large multipart upload complete?
我正在嘗試使用以下方法將大文件從本地計算機自動上傳到 Google 驅動器:
我的代碼
public final void copyFileGoogle(String fPath, String folderIDParent, String fName) throws IOException {
Drive driveService = GoogleDriveUtils.getDriveService();
File fileMetadata = new File();
fileMetadata.setName(fName);
fileMetadata.setParents(Collections.singletonList(folderIDParent));
java.io.File filePath = new java.io.File(fPath + "\\" + fName);
FileContent mediaContent = new FileContent("multipart/related", filePath);
File file = driveService.files().create(fileMetadata, mediaContent)
.setFields("id, parents")
.execute();
它似乎工作正常,但我不知道上傳是否完成。 我在這里找到了以下內容,它應該告訴我何時完成:
發現堆棧溢出
import com.google.api.client.googleapis.media.MediaHttpUploader;
import com.google.api.client.googleapis.media.MediaHttpUploaderProgressListener;
public class UploadProgressListener implements MediaHttpUploaderProgressListener {
public void upLoadProgress(MediaHttpUploader mediaHttpUploader) throws IOException {
if (mediaHttpUploader == null) return;
switch (mediaHttpUploader.getUploadState()) {
case INITIATION_STARTED:
break;
case INITIATION_COMPLETE:
break;
case MEDIA_IN_PROGRESS:
break;
case MEDIA_COMPLETE:
//System.out.println("Upload is complete!");
case NOT_STARTED:
break;
default:
break;
}
}
}
這看起來很棒,但我不知道如何實現它,或者它是否仍然適用於新的 Google API。
我試過:
試過但沒有用
UploadProgressListener ProgressListener;
ProgressListener.uploadProgress(file);
我收到一個錯誤。 它想要一個 MediaHttpUploader .... 幫助
更新:我做了一些測試,發現“在我的情況下”(Windows 平台),我會假設所有但......,該程序在當前上傳完成之前不會繼續。 我想確保我不會對運行它的系統征稅,所以這就是我所需要的。 如果你真的需要知道在這種情況下它完成了上傳,我想你可以做一個 System.out.println("Complete.");
如果有人真的讓 UploadProgressListener 工作,我仍然很想知道如何。 只是出於好奇。
實現分段上傳和顯示上傳進度有兩種方式。 一種是使用Drive API V2 ,另一種是使用Drive API V3 。 我將展示這兩種解決方案,以防有人有興趣同時嘗試它們或使用舊的 V2。
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-drive</artifactId>
<version>v3-rev20191108-1.30.3</version>
</dependency>
public void UploadMultipartFile(Drive drive, String pathname) throws IOException {
File fileMetadata = new File();
fileMetadata.setName("yourname.mp4");
java.io.File mediaFile = new java.io.File(pathname);
InputStreamContent mediaContent =
new InputStreamContent("video/mp4",
new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());
HttpResponse file = drive.files().create(fileMetadata, mediaContent)
.setFields("id")
.getMediaHttpUploader()
.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)
.setProgressListener(new CustomProgressListener())
.setDirectUploadEnabled(false)
.upload(new GenericUrl("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"));
System.out.println(file.getStatusMessage());
}
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-drive</artifactId>
<version>v2-rev310-1.23.0</version>
</dependency>
public void UploadMultipartFile(Drive drive, String pathname) throws IOException {
java.io.File file = new java.io.File(pathname);
File fileMetadata = new File();
fileMetadata.setTitle("video.mp4");
fileMetadata.setDescription("description");
fileMetadata.setMimeType("video/mp4");
InputStreamContent mediaContent =
new InputStreamContent("video/mp4",
new BufferedInputStream(new FileInputStream(file)));
mediaContent.setLength(file.length());
Drive.Files.Insert request = drive.files().insert(fileMetadata, mediaContent);
request.getMediaHttpUploader()
.setProgressListener(new CustomProgressListener())
.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)
.setDirectUploadEnabled(false);
request.execute();
}
使用前面的代碼,我假設您以正確的方式配置了服務帳戶和憑據文件,以便調用 Drive API。 有多種方法可以構建您的雲端硬盤服務,因此,如果您對另一種方式感到更舒服,除了我使用的那種方式,請隨時更改我的代碼。另外,不要忘記將 mime 類型設置為您的文件需要的類型。
一個版本和另一個版本之間的最大區別在於您發送請求的方式。 在 V2 中你必須使用.execute();
從Insert Class 開始,同時在 V3 中,您必須使用MediaHttpUploader Class 中的.upload()
方法。
我檢查了這些文檔以幫助您:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.