Google Drive api Java - моя большая многочастная загрузка завершена? - PullRequest
2 голосов
/ 18 января 2020

Я пытаюсь выполнить автоматическую загрузку больших файлов на диск 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 .... HELP

ОБНОВЛЕНИЕ: Я провел некоторое тестирование и нашел "в моем случае" (windows платформа), я бы предположил, все, кроме ..., программа не будет go включен до завершения текущей загрузки. Я хотел убедиться, что я не перерасходу налог на систему, на которой я работал, так что это было все, что мне было нужно. Если вам действительно нужно знать, что в этом случае загрузка была завершена, я думаю, вы могли бы просто выполнить System.out.println ("Complete.");

Если кто-то действительно заставит UploadProgressListener работать, я все равно люблю знать как. Просто из любопытства.

1 Ответ

1 голос
/ 22 января 2020

Существует два способа выполнить многоэтапную загрузку и показать ход загрузки. Один использует 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());
}

Drive 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. Существует несколько способов создания службы Drive, поэтому, если вы чувствуете себя более комфортно с другим способом, помимо того, который я использовал, смело меняйте мой код. Также не забывайте тип mime, который нужен вашему файлу.


Уведомление

Самое большое различие между одной версией и другой, это способ отправки запроса. В V2 вы должны использовать .execute(); из Вставить класс , в то время как V3, вы должны использовать .upload() метод из MediaHttpUploader Class .

Документы

Я проверил эти документы, чтобы помочь вам:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...