Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

path name contains null byte for image url while existing

I'm using the following code to get the width of image using Dimensions Gem.

file_path = "http://localhost:3000/uploads/resize/avatar/25/ch05.jpg"
width = Dimensions.width(open(file_path).read)

When I put the image url in url bar it renders the image in browser. what I'm trying to do is to get the width of image. so can anyone know what I'm doing wrong?

like image 990
Mani Avatar asked Sep 12 '25 03:09

Mani


1 Answers

So your issue is that Dimensions requires a file path to determine the width of the image. open will return a StringIO and open(...).read will return a String both will fail when using File.open.

Dimensions#width

def width(path)
  io_for(path).width
end

Dimensions#io_for

def io_for(path)
  Dimensions(File.open(path, "rb")).tap do |io|
    io.read
    io.close
  end
end

To work around this you can download the image to a Tempfile and then use that path to pass to Dimensions.width like so

 path = "http://localhost:3000/uploads/resize/avatar/25/ch05.jpg"
 t = Tempfile.new                 # you could add a name but it doesn't matter
 t.write(open(path).read)         # write the image to the Tempfile
 t.close                          # must close the file before reading it
 width = Dimensions.width(t.path) # pass the Tempfile path to Dimensions
 t.unlink                         # deletes the Tempfile 

We can make this look a little cleaner like so:

def get_width_of_url_image(url)
  t = Tempfile.new.tap do |f| 
    f.write(open(url).read)
    f.close
  end
  width = Dimensions.width(t.path)
  t.unlink and width
end

get_width_of_url_image("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png")
#=> 272
like image 195
engineersmnky Avatar answered Sep 13 '25 18:09

engineersmnky