直接和可续传的媒体上传

本文档介绍了如何搭配使用直接上传和可续传媒体上传和 适用于 Java 的 Google API 客户端库。

可续传媒体上传

将大型媒体文件上传到服务器时,请使用可续传媒体上传来 逐个发送文件。Google API 生成的库包含 与可续传媒体上传进行交互的便捷方法。

可续传媒体上传协议与可续传媒体上传协议类似 Google Drive API 文档中介绍的协议。

协议设计

以下序列图显示了可续传媒体上传协议的工作原理:
显示请求和响应如何在客户端和服务器之间移动的序列图。

实现细节

需要关注的主要类别包括 MediaHttpUploaderMediaHttpProgressListener

如果特定于服务生成的库中的方法包含 mediaUpload 参数(位于发现文档中), 那么系统会为这些方法创建一种便捷方法,该方法接受 InputStreamContent 作为参数传递。(有关通过 Google API 使用媒体上传的详情 Discovery Service,请参阅 媒体上传。)

例如,Drive APIinsert 方法 支持 mediaUpload,您可以使用以下代码上传文件:

class CustomProgressListener implements MediaHttpUploaderProgressListener {
  public void progressChanged(MediaHttpUploader uploader) throws IOException {
    switch (uploader.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:
        System.out.println(uploader.getProgress());
        break;
      case MEDIA_COMPLETE:
        System.out.println("Upload is complete!");
    }
  }
}

File mediaFile = new File("/tmp/driveFile.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

Drive.Files.Insert request = drive.files().insert(fileMetadata, mediaContent);
request.getMediaHttpUploader().setProgressListener(new CustomProgressListener());
request.execute();

您也可以使用可续传媒体上传功能,而不使用服务专用 生成的库示例如下:

File mediaFile = new File("/tmp/Test.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, transport, httpRequestInitializer); uploader.setProgressListener(new CustomProgressListener()); HttpResponse response = uploader.upload(requestUrl); if (!response.isSuccessStatusCode()) { throw GoogleJsonResponseException(jsonFactory, response); }

直接上传媒体内容

可续传媒体上传功能默认处于启用状态,但您可以将其停用,然后使用 直接上传媒体内容,例如上传小文件。直接 媒体上传在 1.9.0-beta 版本中引入 适用于 Java 的 Google API 客户端库。

直接媒体上传通过一个 HTTP 请求来上传整个文件, 可续传媒体上传协议,可通过多个请求上传文件。 直接上传可减少 HTTP 请求数量,但会增加 或大型应用上发生的一些故障(如连接故障) 上传。

直接上传媒体的方法与上述 可续传媒体上传,以及以下调用会告知 MediaHttpUploader 只进行直接上传:

mediaHttpUploader.setDirectUploadEnabled(true);