Rails アプリケーションで google-api-ruby-client を使用して、Google ドライブとやり取りしています。フォルダー内のファイルの一覧表示、ファイルの取得、移動、コピー、削除、新しいフォルダーの作成などのすべての基本機能は正常に動作しています。
ただし、新しいファイルのアップロードは常に Timeout::Error で失敗します
アップロードするファイルを自分の Web サイト (multipart/form-data) から通常のファイル アップロードとして受け取り、これが Google ドライブにアップロードする方法です
result = nil
new_file_obj = google_drive.files.insert.request_schema.new({
'title' => file_name,
'mimeType' => file_mime_type,
'parents' => [{'id' => current_folder_id}]
})
file_content = Google::APIClient::UploadIO.new(new_file.tempfile, file_mime_type, file_name)
result = google_client.execute(
api_method: google_drive.files.insert,
body_object: new_file_obj,
media: file_content,
parameters: {
'uploadType' => 'multipart',
'alt' => 'json'
}
)
new_file
クライアントがアップロードしたファイルは次のとおりです。new_file.tempfile
タイプ のオブジェクトを返しTempfile
ます。
execute
メソッドは返されず、最終的に Timeout::Error 例外が発生します。これは関連するスタック トレースです:
/lib/ruby/1.9.1/net/protocol.rb:140:in `rescue in rbuf_fill'
/lib/ruby/1.9.1/net/protocol.rb:134:in `rbuf_fill'
/lib/ruby/1.9.1/net/protocol.rb:116:in `readuntil'
/lib/ruby/1.9.1/net/protocol.rb:126:in `readline'
/lib/ruby/1.9.1/net/http.rb:2211:in `read_status_line'
/lib/ruby/1.9.1/net/http.rb:2200:in `read_new'
/lib/ruby/1.9.1/net/http.rb:1183:in `transport_request'
/lib/ruby/1.9.1/net/http.rb:1169:in `request'
/lib/ruby/1.9.1/net/http.rb:1162:in `block in request'
/lib/ruby/1.9.1/net/http.rb:627:in `start'
/lib/ruby/1.9.1/net/http.rb:1160:in `request'
/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/adapter/net_http.rb:74:in `perform_request'
/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/adapter/net_http.rb:37:in `call'
/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/request/url_encoded.rb:14:in `call'
/lib/ruby/gems/1.9.1/gems/google-api-client-0.5.0/lib/google/api_client/request.rb:154:in `send'
/lib/ruby/gems/1.9.1/gems/google-api-client-0.5.0/lib/google/api_client.rb:546:in `execute'
ここの例に従ってこのコードを書きました: https ://developers.google.com/drive/examples/ruby# Saving_new_files
アップロードしようとしているファイルは小さな png 画像です。ディスクに書き込むとファイルを表示できるため、ファイルは Web アプリケーションに適切に送信されます。drive.google.com からファイルをアップロードできるので、Google サーバーはダウンしていません。これは、ネットワークが十分であることも意味します。
では、タイムアウトの原因は正確には何ですか?
この同じ例外の解決策として、read_timeout を増やすことが挙げられています (http://stackoverflow.com/questions/10011387/rescue-in-rbuf-fill-timeouterror-timeouterror)。それは私がすべきことですか?もしそうなら、ここで google-api-ruby-client sdk を使用してそれを行うにはどうすればよいですか?