Как сохранить изображение с URL-адреса в локальную папку ubuntu с консоли rails?

Мне нужно написать парсер изображений с некоторого веб-сайта, который будет принимать изображения, другую информацию и сохранять ее в моей локальной папке. Итак, скажем, у нас есть образ по этому URL: https://i.stack.imgur.com/MiqEv.jpg (это кто-то SO-аватар)

Поэтому я хочу сохранить его в локальной папке. Скажем, "~/test/image.png" Я нашел ссылку

И я попробовал это в своем терминале:

rails console

require 'open-uri'
  open('~/test/image.jpg', 'wb') do
  |file| file << open('https://i.stack.imgur.com/MiqEv.jpg').read
end

Как вы видите, моя домашняя/тестовая папка пуста введите описание изображения здесь

И я получил этот вывод с консоли #<File:~/test/image.jpg (closed)> введите описание изображения здесь

Что мне делать?

Также я пробовал это:

require 'open-uri'
download = open('https://i.stack.imgur.com/MiqEv.jpg')
IO.copy_stream(download, '~/test/image.jpg')

И получил этот вывод:

= > #https://i.stack.imgur.com/MiqEv.jpg > , @meta = { "date" = > "Пт, 06 мая 2016 г. 11:58:05 GMT", "content-type "= > " image/jpeg", "content-length "= > " 4276", "Соединение" = > "держать-жив", "Set-Cookie" = > "__ cfduid = d7f982c0742bf40e58d626659c65a88841462535885; expires = Sat, 06-May-17 11:58:05 GMT; Путь =/; домен =.imgur.com; HttpOnly", "cache-control "= > " public, max-age = 315360000", "etag" = > "\" b75caf18a116034fc3541978de7bac5b\ "," expires "= > " Mon, 04 Май 2026 11:58:05 GMT "," last-modified "= > " Чт, 28.03.2013 15:05:35 GMT "," x-amz-version-id "= > " TP7cpPcf0jWeW2t1gUz66VXYlevddAYh "," cf-cache-status "= > " HIT "," vary "= > " Accept-Encoding "," server "= > " cloudflare-nginx "," cf-ray "= > " 29ec4221fdbf267e-FRA"}, @metas = { "date" = > ["Пт, 06 май 2016 11:58:05 GMT "]," content-type "= > [" image/jpeg "]," content-length "= > [" 4276"], "Соединение" = > [ "держать-жив" ], "Set-Cookie" = > [ "__ cfduid = d7f982c0742bf40e58d626659c65a88841462535885; expires = Sat, 06-May-17 11:58:05 GMT; Путь =/; домен =.imgur.com; HttpOnly" ], "cache-control "= > [" public, max-age = 315360000" ], "etag" = > [ "\" b75caf18a116034fc3541978de7bac5b\" "]," expires "= > [" Mon, 04 Май 2026 11:58:05 GMT "]," last-modified "= > [" Чт, 28.03.2013 15:05:35 GMT "]," x-amz-version-id "= > [" TP7cpPcf0jWeW2t1gUz66VXYlevddAYh "]," cf-cache-status "= > [" HIT "]," vary "= > [" Accept-Encoding "]," server "= > [" cloudflare-nginx "]," cf-ray "= > [" 29ec4221fdbf267e-FRA "]}, @status = [" 200 "," OK "] > 2.3.0: 244 > IO.copy_stream (скачать, '~/test/image.jpg') = > 4276 введите описание изображения здесь

Но моя папка все еще пуста. Что мне делать?

Ответ 1

Проблема в том, что файл не создается. Если вы создаете файл с помощью File.open или open, а затем выполните "IO.copy_stream", он будет работать.

Также ~/ не работает в ruby. Вы должны указать весь путь.

require 'open-uri'
download = open('https://i.stack.imgur.com/MiqEv.jpg')
open('/home/user/image.jpg', 'w')
IO.copy_stream(download, '~/test/image.jpg')

Если вы хотите, чтобы каталог также был создан, вам нужно будет Dir.mkdir. Если вы хотите создать вложенные каталоги, используйте FileUtils::mkdir_p. Если это трудно использовать, я бы предложил использовать system 'mkdir dirname' или system 'mkdir -p dir1/dir2/dir3'

Dir.mkdir '/home/user/test' # doesnt work for nested folder creation

require 'fileutils'
FileUtils::mkdir_p '/home/user/test1/test2' # for nested

system 'mkdir '~/test'   # Unix command for directory creation
system 'mkdir -p '~/test1/test2'   # Unix command for nested directory

Надеюсь, что это поможет

Ответ 2

Если вы используете Ubuntu, можете ли вы просто использовать wget?

Вы можете использовать как wget 'https://i.stack.imgur.com/MiqEv.jpg', так и system("wget 'https://i.stack.imgur.com/MiqEv.jpg'"). Или system("wget 'https://i.stack.imgur.com/MiqEv.jpg' > /your/path

Примечание: для первой команды вам необходимо обернуть команду в знаки. Это вызовет рубину для вызова системной команды.

Кроме того, используйте /home/your_name вместо ~. Также обратите внимание на ведущую черту /.