Загрузить изображение с Ruby RIO gem - PullRequest
2 голосов
/ 21 февраля 2009

Мой код:

require 'rio'
rio('nice.jpg') < rio('http://farm4.static.flickr.com/3134/3160515898_59354c9733.jpg?v=0')

Но загруженное изображение обрезается. Что не так с этим решением?

Ответы [ 6 ]

3 голосов
/ 21 февраля 2009

pjb3 правильно. Вы должны позвонить binmode с левой стороны:

rio('nice.jpg').binmode < rio('http://...')

Если это по-прежнему не работает (в частности, это может произойти для больших файлов JPEG, т. Е. Rio использует промежуточный временный файл при получении по указанному вами URL-адресу), тогда примените модификатор binmode к обоим терминам:

rio('nice.jpg').binmode < rio('http://...').binmode

2011 ОБНОВЛЕНИЕ

По словам Люка С., приведенный выше ответ больше не относится к более поздним версиям камня:

Ни одна из этих работ. В Linux установка .binmode в месте назначения вызывает исключение Errno :: ENOENT. Выполнение: rio ('nice.jpg')

1 голос
/ 11 августа 2011

Вот простой рубиновый код для загрузки изображения

require 'net/http'
url = URI.parse("http://www.somedomain.com/image.jpg")
Net::HTTP.start(url.host, url.port) do |http|
  resp, data = http.get(url.path, nil)
  open( File.join(File.dirname(__FILE__), "image.jpg"), "wb" ) { |file| file.write(resp.body) }
end

Это может быть даже расширено, чтобы следовать перенаправлениям:

require 'net/http'
url = URI.parse("http://www.somedomain.com/image.jpg")
Net::HTTP.start(url.host, url.port) do |http|
  resp, data = http.get(url.path, nil)
  prev_redirect = ''
  while resp.header['location']
    raise "Recursive redirect: #{resp.header['location']}" if prev_redirect == resp.header['location']
    prev_redirect = resp.header['location']
    url = URI.parse(resp.header['location'])
    host = url.host if url.host
    port = url.port if url.port
    http = Net::HTTP.new(host, port)
    resp, data = http.get(url.path, nil)
  end
  open( File.join(File.dirname(__FILE__), "image.jpg"), "wb" ) { |file| file.write(resp.body) }
end

Возможно, что-то может быть приукрашено, но оно выполняет свою работу и не зависит от каких-либо драгоценных камней третьих лиц! :)

1 голос
/ 01 декабря 2009

У меня были похожие проблемы с загрузкой изображений в Linux, я обнаружил, что это работает для меня:

rio (source_url) .binmode> rio (имя файла)

1 голос
/ 21 февраля 2009

Это работает для меня. Вы на окнах? Это может быть связано с тем, что файл не открывается с двоичным флагом.

0 голосов
/ 26 июля 2011

Для загрузки картинок с веб-страницы вы можете использовать ruby ​​gem image_downloader

0 голосов
/ 07 декабря 2009

Я думаю, это ошибка. На окнах все 0x0A заменены на 0x0D 0x0A. И, как так, он считает, что правильно (с .binmode) он работает на Linux.

...