本文档介绍了如何搭配使用直接上传和可续传媒体上传和 适用于 Java 的 Google API 客户端库。
可续传媒体上传
将大型媒体文件上传到服务器时,请使用可续传媒体上传来 逐个发送文件。Google API 生成的库包含 与可续传媒体上传进行交互的便捷方法。
可续传媒体上传协议与可续传媒体上传协议类似 Google Drive API 文档中介绍的协议。
协议设计
以下序列图显示了可续传媒体上传协议的工作原理:
实现细节
需要关注的主要类别包括 MediaHttpUploader 和 MediaHttpProgressListener。
如果特定于服务生成的库中的方法包含 mediaUpload
参数(位于发现文档中),
那么系统会为这些方法创建一种便捷方法,该方法接受
InputStreamContent
作为参数传递。(有关通过 Google API 使用媒体上传的详情
Discovery Service,请参阅
媒体上传。)
例如,Drive API 的 insert
方法
支持 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);