Загрузите файл с Google Диска, используя google-api-ruby-client

Я пытаюсь загрузить файлы из каталога на Google Disk.

Код, в основном скопированный из официального руководства по быстрому запуску, работает нормально:

# ... 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 ​​в официальном руководстве по загрузке файлов.

Я тоже пробовал content = service.get_file(file.id, download_dest: "/tmp/#{file.name}"), но это не удалось с тем же набором ошибок.

ОБНОВЛЕНИЕ: Вот мои выводы. Если вы начнете с краткого учебного руководства по Google Drive API Ruby и хотите, чтобы он что-то загрузил,

1) измените область видимости, чтобы ваш скрипт не только читал meatadata, но и читал содержимое файлов:

SCOPE = Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLYпо крайней мереSCOPE = Google::Apis::DriveV3::AUTH_DRIVE_READONLY

2) Отфильтруйте файлы Google Docs, потому что вы не можете скачать их таким образом, вы должны конвертировать их. Чтобы подать их:

2.1) Добавить mime_type Для набора полей:

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

2.2) и в последнем цикле, где вы печатаете идентификаторы и имена файлов, поместите что-то вроде

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

1 ответ

Решение

Из полученной ошибки написано, что ваш запрос недействителен. Поэтому убедитесь, что ваш запрос там правильный. Вот документация о том, как скачивать файлы с использованием Ruby(просто нажмите Ruby на примере, чтобы просмотреть код ruby.)

Обратите внимание: загрузка файла требует, чтобы у пользователя был как минимум доступ на чтение. Кроме того, ваше приложение должно быть авторизовано с областью, которая позволяет читать содержимое файла.

Для получения дополнительной информации, проверьте эти темы:

Другие вопросы по тегам