ChunkyPNG: можно ли прочитать изображение прямо с URL?

Я пытался (с некоторым успехом)

require 'open-uri'
require 'chunky_png'

image_url = "http://res.cloudinary.com/houlihan-lokey/image/upload/c_limit,h_75,w_120/ixl7z4c1czlvrqnbt0mm.png"
# image_url = "http://res.cloudinary.com/houlihan-lokey/image/upload/c_limit,h_75,w_120/zqw2pgczdzbtyj3aib2o.png" # this works

image_file = open(image_url)
image = ChunkyPNG::Image.from_file(image_file)
puts image.width

Некоторые изображения работают, другие нет. Ошибка:

TypeError: no implicit conversion of StringIO into String
from /Users/theuser/.rvm/gems/ruby-2.0.0-p247/gems/chunky_png-1.3.3/lib/chunky_png/datastream.rb:66:in `initialize'
from /Users/theuser/.rvm/gems/ruby-2.0.0-p247/gems/chunky_png-1.3.3/lib/chunky_png/datastream.rb:66:in `open'
from /Users/theuser/.rvm/gems/ruby-2.0.0-p247/gems/chunky_png-1.3.3/lib/chunky_png/datastream.rb:66:in `from_file'
from /Users/theuser/.rvm/gems/ruby-2.0.0-p247/gems/chunky_png-1.3.3/lib/chunky_png/canvas/png_decoding.rb:53:in `from_file'
from (irb):5
from /Users/theuser/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>'

Я буду запускать это на Heroku, и мне интересно, есть ли надежный способ достичь этого без создания временных файлов?

1 ответ

Решение

Проблема была с файлами, которые были слишком малы для open создать временный файл для.

Решение заключается не в том, чтобы полагаться на временные файлы, а на считывание изображения в память и использование функции ChunkyPNG Image.from_blob:

require 'open-uri'
require 'chunky_png'

image_url = "http://res.cloudinary.com/houlihan-lokey/image/upload/c_limit,h_75,w_120/ixl7z4c1czlvrqnbt0mm.png"

image_file = open(image_url).read
image = ChunkyPNG::Image.from_blob(image_file)
puts image.width

Это может не работать с большими изображениями, но это нормально для моего приложения.

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