2016-09-23 26 views
0

Googleディスクのディレクトリからファイルをダウンロードしようとしています。google-api-ruby-clientを使用してGoogleドライブからファイルをダウンロード

ほとんどofficial quickstart guideからコピーしたコード、正常に動作します:

# ... code from official quickstart tutorial... 

# Initialize the API 
service = Google::Apis::DriveV3::DriveService.new 
service.client_options.application_name = APPLICATION_NAME 
service.authorization = authorize 


# now the real deal 
response = service.list_files(q: "'0ByJUN4GMe_2jODVJVVpmRE1VTDg' in parents and trashed != true", 
           page_size: 100, 
           fields: 'nextPageToken, files(id, name)') 
puts 'Files:' 
puts 'No files found' if response.files.empty? 
response.files.each do |file| 
    puts "#{file.name} (#{file.id})" 
    # content = service.get_file(file.id, download_dest: StringIO.new) 
end 

出力は正常に見える:

Files: 
k.h264 (0B4D93ILRdf51Sk40UzBoYmZKMTQ) 
output_file.h264 (0B4D93ILRdf51V1RGUDFIWFQ5cG8) 
test.mp4 (0B4D93ILRdf51dWpoZWdBV3l4WjQ) 
test2.mp4 (0B4D93ILRdf51ZmN4ZGlwZjBvR2M) 
test3.mp4 (0B4D93ILRdf51ZXo0WnVfdVBjTlk) 
12.mp4 (0ByJUN4GMe_2jRzEwS1FWTnVkX00) 
01.mp4 (0ByJUN4GMe_2jSlRWVEw4a1gxa2s) 
01.mp4 (0ByJUN4GMe_2jOFpPMW9YNjJuY2M) 

しかし、私はcontent = service.get_file(file.id, download_dest: StringIO.new)のコメントを外したら、私はエラーの多くを得る:

Files: 
k.h264 (0B4D93ILRdf51Sk40UzBoYmZKMTQ) 
/Users/mvasin/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/google-api-client-0.9.15/lib/google/apis/core/http_command.rb:211:in `check_status': Invalid request (Google::Apis::ClientError) 
[...lots of other 'from' stuff...] 
from /Users/mvasin/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/google-api-client-0.9.15/generated/google/apis/drive_v3/service.rb:772:in `get_file' 
from quickstart.rb:56:in `block in <main>' 
from quickstart.rb:54:in `each' 
from quickstart.rb:54:in `<main>' 

しかし、これは、Rubyのセクションに従って動作するはずです"download files" official tutorial

私もcontent = service.get_file(file.id, download_dest: "/tmp/#{file.name}")を試しましたが、同じエラーで失敗しました。

更新:ここに私の発見があります。あなたはGoogle Drive API Ruby quick start tutorialで開始し、必要な場合は、それが何かをダウンロード作る、

1)変更の範囲だけでスクリプトがmeatadataを読んでみましょうが、同様に、ファイルの内容を読んでいた:

SCOPE = Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY 少なくとも SCOPE = Google::Apis::DriveV3::AUTH_DRIVE_READONLY

2)Googleドキュメントのファイルをフィルタリングすると、このようにダウンロードできないため、変換する必要があります。それらをファイラーには:

2.1)を設定filedsにmime_typeを追加します。

response = service.list_files(page_size: 10, fields: 'nextPageToken, files(id, name, mime_type)')

2.2)とは、ファイルIDと名前を印刷し、最終的なループで、

service.get_file(file.id, download_dest: "/your/path/#{file.name}") unless file.mime_type.include? "application/vnd.google-apps"

のようなものを置きます
+1

あなたは' download_destことなく、同じエラーが出るのですか? – Nakilon

+0

@Nakilon 'download_dest:を省略するとエラーは発生しません:...'、' content'変数は 'Google :: Apis :: DriveV3 :: File'クラスの適切なインスタンスと思われます。しかし、どうすればファイルを保存できますか? 'content.web_content_link'は' nil'を返します(フィールドをフィルタリングしないように 'response = service.list_files(page_size:10)'を変更しましたが、それは役に立ちません)。 – Mike

答えて

0

エラーが発生したため、リクエストが無効であると表示されます。だからあなたの要求が正しいことを確認してください。ここではルビーを使用してファイルをダウンロードする方法のdocumentationが(ちょうどRubyコードを表示する例でルビーをクリックしてください。)である

テイク注:ファイルをダウンロードすると、少なくとも 読み取りアクセスを持っているユーザーが必要です。さらに、ファイルの内容を読み取ることができる scope でアプリを承認する必要があります。詳細については

、これらのスレッドをご確認ください: `引数:

+0

私はスコープを 'Google :: Apis :: DriveV3 :: AUTH_DRIVE'に増やしましたが、助けにはなりませんでした。私はまだ同じエラーがあります。 – Mike

+1

http_command.rb:211は次のようになります: 'raise Google :: Apis :: ClientError.new(message、status_code:status、header:header、body:body)'私はこれらの変数をデバッグする必要がありました。 'status'は' 403'であり、 'header'には'バイナリコンテンツを持つファイルしかダウンロードできません。 Google Docsファイルを使ってエクスポートする.'それはちょうど私がフォルダ内のいくつかのGoogleドキュメントファイルを持っていたことが起こった、彼らはエラーを投げた。非常に情報の間違いです。今は大丈夫です! – Mike

関連する問題