如何使用google-api-ruby客户端将Resumable上传到Google云端硬盘?

我在将我的Linux桌面上的大文件上传到GDrive时遇到问题(通过使用不提供恢复甚至监控较大上传的Grive)。

所以我开始尝试使用google-api-ruby编写一个小脚本来完成这项工作。

由于Google推出了有关Resumable上传的文档说明 – https://developers.google.com/drive/manage-uploads#resumable – 我试图使用google-api-ruby实现Resumable上传,并找到了Google::APIClient::ResumableUpload类。

样本对于理解这个rubyish API如何工作的原理非常有用,但是样本没有提到Resumable uploads的使用

Google::APIClient::ResumableUpload类是用于文档所讨论的可恢复上传 ,还是由此Ruby客户端提供的对话类?

当我调用executeexecute时, Google::APIClient::Result构造函数会消耗我得到的Google::APIClient::Result Google::APIClient实例上。

据我所知, execute方法仅适用于暴露给Discovery API的 Google API方法(例如drive.files.insert )。

不幸的是, Resumable上传与以下URI相关联:

https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable

并且似乎还没有成为Discovery的一部分或者整合成一个“更清洁”的URI方案(为什么upload/drive而不是drive/upload ?)。

是否可以对此API URI使用Google::APIClient 执行方法,以便将其与Google::APIClient::ResumableUpload结合使用oder我是否必须自己实施可恢复上传 (例如,使用em-http-request )?

有关基础知识,请参阅files.insert的示例。 在该示例中,它使用multipart,但切换到可恢复是相当简单的。 通常需要将uploadType参数更改为“可恢复”。 插入/更新的结果将包含对上传者的引用,而不是用于发送内容/检查完成的内容。

 media = Google::APIClient::UploadIO.new(file_name, mime_type) result = client.execute( :api_method => drive.files.insert, :body_object => file, :media => media, :parameters => { 'uploadType' => 'resumable', 'alt' => 'json'}) # Send content result.resumable_upload.send_all(client) 

在即将发布的客户端库测试版(现在任何一天:)中,这将略有改变,以便无论协议如何,上传工作都会更加统一。 在大多数情况下,调用execute()就足够了,它将尝试上传文件。 但现有方法仍然有效。 您也可以通过以下方式恢复:

 if !result.resumable_upload.complete? client.execute(result.resumable_upload) # Continue sending... end 

示例未显示error handling,但您可以检查result.resumable_upload.complete? 或.expired? 检查状态。 不完整的可恢复上传文件在一段时间不活动后会过期(大约一个小时左右。)如果过期,则需要从头开始重新启动。