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

时间:2012-09-14 10:28:39

标签: ruby google-drive-api grive

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

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

Google正在推动关于可恢复上传的文档说明 - https://developers.google.com/drive/manage-uploads#resumable - 我正在尝试使用 google-api-ruby 实施 Resumable uploads em>并找到Google::APIClient::ResumableUpload类。

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

Google::APIClient::ResumableUpload精神是否用于可恢复上传文档正在讨论或更确切地说是此Ruby客户端提供的对象类?

当我在Google::APIClient::ResumableUpload实例上调用Google::APIClient::Result执行!时,

execute构造函数会消耗Google::APIClient

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

不幸可恢复上传与以下URI相关联:

  

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

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

是否可以对此API URI使用Google::APIClient 执行方法,以便将其与Google::APIClient::ResumableUpload结合起来,我是否必须实施 Resumable uploads em-http-request)?

1 个答案:

答案 0 :(得分:3)

有关基础知识,请参阅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

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