当前位置: 首页 > 面试题库 >

检查上传和下载的进度(适用于Android或Java的Google Drive API)

尹俊雅
2023-03-14
问题内容

如何检查使用GoogleDrive API的上传进度?

。service.files()插入(身体,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

如果我使用 断点续传 ,我现在可以取得一些进展,我将chunksize设置为1MB。但是现在有两个问题。

1)可恢复上传比单次上传要慢得多,因为可恢复上传在两次之间进行了多次,每次仅发送1MB。
如果我将chunksize设置为更高,则对于较小的文件根本不会显示进度。
因此,可恢复上传的进度并不是我真正想要的。我想要单次上传的进度。

2)如果我将chunksize设置为大约1MB,则对于正常的10MB文件,我的上传总是 失败 ,大约 失败 率为70%。
如果我将chunksize设置为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)

问题答案:

进度监听器:

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

直接媒体上传将 在一个请求中 上传整个媒体内容 而不是可以在多个请求中上传的可恢复媒体上传协议。

直接上载减少了HTTP请求的数量,但 增加 了大型媒体上载 失败的更改 (例如,连接失败)。

由于库的体系结构,您必须在块和进度之间进行选择,或者在没有进度的情况下进行选择。最小的块大小应该可以改善情况。较小的块:

setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)

希望能帮助到你!



 类似资料:
  • 问题内容: 是否有读取ePub格式的库?我在http://github.com/psiegman/epublib中找到了ePublib 。我仍在学习如何使用它。 是否有适用于Android的ePub jar? 问题答案: 我是epublib的作者。现在可以在Android上运行。参见http://www.siegmann.nl/epublib/android

  • 问题内容: 设置INTERNET_ACCESS等后,出现此错误。 这是我测试过的代码的另一部分,仍然收到该异常 } 问题答案: “ftp.194.90.81.149”: No address associated with hostname 您收到UnknownHostException的事实意味着ftp.194.90.81.149在DNS中不是真实的主机名。我怀疑其中的数字部分是您真正想要的。即

  • 问题内容: 我正在开发一个带有Java组件的网站项目,目前正在测试跨浏览器的兼容性。大部分都很好,但是Java部分不会在64位浏览器上加载。看起来我需要64位JRE进行测试。在哪里可以下载Windows的(离线)64位Java运行时安装程序? 官方下载页面在这里:http : //www.java.com/en/download/manual.jsp 除非我是盲人,否则除了指向注释的链接之外,Wi

  • 首先,我读了corda关于使用附件的文档。然而,我仍然有问题的过程上传和下载附件。 我的任务是编写一个简单的cordapp,用于将文件从NodeA传输到NodeB。从NodeA shell上传一个zip文件后,我收到一个散列,然后将其包含在事务中。流动成功。然而,在NodeB中,我无法取回该文件。然后我尝试使用该散列从NodeA获取文件。但是,shell返回错误消息并表示InvalidInputS

  • 问题内容: 我有一个JPS,其中用户可以在其中放置图像: 我写了这个js: 可以很好地检查文件类型和大小。现在,我想检查图像的宽度和高度,但是我不能这样做。 我已经尝试过,但是我得到了。用其他方式我得到。 有什么建议? 问题答案: 该文件只是一个文件,您需要像这样创建一个图像: 我认为您意识到只有少数浏览器支持此功能。到现在为止,大多数都是Firefox和Chrome,也可以成为歌剧。 PSURL

  • 问题内容: 在Python 3的文件下载过程中,我需要显示一个进度。我已经看到了一些关于主题,但是考虑到我对编程不熟悉,没有人张贴完整的示例,只是其中的一部分,或者是我可以使Python 3上的工作对我没有好处… 附加信息: 好的,所以我有这个: 脚本通过python命令行运行 问题答案: 有将URL下载到文件并允许指定reporthook回调来报告进度的方法: 这是一个GUI进度栏: 在Pyth