Как сохранить изображение с 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
вместо ~
. Также обратите внимание на ведущую черту /
.