我在将大型文件从Linux桌面上传到GDrive时遇到问题(使用Grive,它不提供恢复,甚至不监控大型上传)。
因此,我尝试使用googleapi-ruby编写一个小脚本来完成这项工作。
当谷歌驱动文档谈论可恢复上传时——https://developers.google.com/drive/manage-uploads#resumable–我试图使用谷歌api ruby实现可恢复上传,并找到了Google::APIClient::ResumableUpload
类。
示例对于理解这个rubyish API的工作原理非常有用,但示例并没有提出可恢复上传的问题。
Google::APIClient::ResumableUpload
类ment是用于文档所说的可恢复上传,还是该Ruby客户端提供的一个方便类?
当我调用execute
或execute时,Google::APIClient::ResumableUpload
构造函数会消耗我得到的Google::APIClient::Result
在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
组合,或者我是否必须自己实现可恢复上载(例如使用em-http-request
)?
请参阅files.insert的示例了解基本信息。在该示例中,它使用多部分,但切换到可恢复状态相当简单。大多数情况下需要将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
示例没有显示错误处理,但您可以检查结果。sumable_upload.complete?或者.过期了?以检查状态。不完整的可恢复上载将在一段时间(大约一个小时)不活动后过期。如果过期,您需要从头开始。