19

GoogleDrive API を使用したアップロードの進行状況を確認するには?

service.files ( ).insert(body, mediaContent).execute(); ファイルが完全にアップロードされたかどうかを確認できるファイルのみを返します。

しかし、とにかくそれを行うには、進行状況をリアルタイムで(少なくとも毎秒程度)確認する必要がありますか?

ダウンロード部分については、入力ストリームから既に読み取ったバイト数と合計ファイルサイズを手動で比較して、現在の進行状況を計算できると思います。

しかし、これは正しい方法ですか?または、進行状況を確認する他のより良い方法はありますか?

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=based-on-1.12&r=08555cd2a27be66dc97505e15c60853f47d84b5a

resumable uploadを使用している場合は、いくらかの進行状況を得ることができます。chunksize を 1MB に設定しました。しかし、現在2つの問題があります。

1) 再開可能なアップロードは、1 回のアップロードよりもはるかに遅くなります。これは、その間に何度も停止し、毎回 1MB しか送信しないためです。
チャンクサイズをより高く設定すると、小さいファイルの進行状況はまったく表示されません。
したがって、再開可能なアップロードの進行状況は、私が実際に望んでいるものではありません。1回のアップロードで進捗が欲しい。

2) チャンクサイズを約 1MB に設定すると、アップロードは通常の 10MB ファイルの約 70% で常に失敗します。
チャンクサイズを 10MB に設定すると成功しますが、進行状況は見られません。

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 エラー:

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)
4

3 に答える 3

12

進捗リスナー:

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/wiki/MediaUpload

複数のリクエストでアップロードできる再開可能なメディア アップロード プロトコルとは対照的に、ダイレクト メディア アップロードでは、メディア コンテンツ全体が 1 つのリクエストでアップロードされます。

直接アップロードを行うと、HTTP 要求の数が減りますが 、大きなメディア アップロードで失敗の変化 (接続障害など) が増加します。

ライブラリのアーキテクチャのため、チャンクと進行状況または進行状況のない 1 つのステップのいずれかを選択する必要があります。最小のチャンクサイズは物事を改善するはずです。より小さなチャンクが可能:

setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)

それが役に立てば幸い!

于 2012-12-25T14:11:39.057 に答える
3

チャンク サイズに関しては、MediaHttpUploader.MINIMUM_CHUNK_SIZE の倍数である必要があるため、以前の値でエラーが発生しました。

于 2013-07-18T00:12:03.723 に答える