簡體   English   中英

Google Drive api Java - 我的大型分段上傳完成了嗎?

[英]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。


DriveAPI V3

依賴

<dependency>
     <groupId>com.google.apis</groupId>
     <artifactId>google-api-services-drive</artifactId>
     <version>v3-rev20191108-1.30.3</version>
</dependency>

Java代碼

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());
}

驅動 API V2

依賴

<dependency>
   <groupId>com.google.apis</groupId>
   <artifactId>google-api-services-drive</artifactId>
   <version>v2-rev310-1.23.0</version>
</dependency>

Java代碼

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM