0

我需要将一些大文件(大约 1Gb)上传到谷歌驱动器。我使用 google-api-client(ruby) 0.5.0 版:

media = Google::APIClient::UploadIO.new(file_name, mimeType, original_name)
result = client.execute!(
        :api_method => client.service.files.insert,
        :body_object => file,
        :media => media,
        :parameters => {
            'uploadType' => 'resumable',
            'alt' => 'json'})

我希望我的客户将大文件拆分为部分并将这些部分上传到驱动器上。但我在日志中看到,那个客户端只发送一个大块来驱动。这是小日志示例:

内容长度:“132447559” 内容范围:“字节 0-132447558/132447559”

如何使用 google-api-client 分块上传大文件?

4

2 回答 2

0

预期用途是尝试将文件上传到单个块中。总的来说,这种方式更有效/更快。但是在某些情况下分块更可取,因此如果您出于某种原因需要对上传进行分块,只需设置 chunk_size 属性:

media = Google::APIClient::UploadIO.new(file_name, mimeType, original_name)
media.chunk_size = 1000000 # 1mb chunks
result = client.execute!(....)
于 2012-12-14T06:59:27.583 回答
0

我使用的是 0.7.1 版的 API,尽管我知道我们现在应该使用 0.9 版,因为旧版本与 Google文档中的 Ruby 示例相匹配。

我不得不求助于分块上传,因为我在 httpclient 库中遇到错误,抱怨文件太大而无法转换为整数!

不幸的是,使用@stevebazyl 对我不起作用,因为它只上传第一个块,然后抛出一个TransmissionError. 这似乎在 google-api-ruby-client 代码中,特别是方法Google::APIClient中的类execute!。它似乎没有处理 308 的 HTTP 状态,这是可恢复上传在需要下一个块时返回的状态。我对代码做了这个:

when 200...300, 308
  result

(见api_client.rb

并使用类#send_all中的方法,ResumableUpload就像文档中的示例代码一样,它对我有用。所以除了@stevebazyl 代码,我还有:

media = Google::APIClient::UploadIO.new(opts[:file], 'video/*')
media.chunk_size = 499200000

videos_insert_response = client.execute!(
  :api_method => youtube.videos.insert,
  :body_object => body,
  :media => media,
  :parameters => {
    :uploadType => 'resumable',
    :part => body.keys.join(',')
  }
)

videos_insert_response.resumable_upload.send_all(client)
于 2016-06-15T23:36:22.827 回答