Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby open-uri open method loses file extension opening images

I'm using ruby 1.9.2 along with Rails 3.1.4 and Paperclip 2.4.5.

My issue is trying to save a paperclip attachment from a URI loses the file extension and saves the file without one resulting in issues with things like fancybox that require an extension.

Some example code:

uri = "http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png"
open(uri)
#=> #<File:/var/folders/zc/d69gxhzx10x_bvjrkqgyjgxr0000gn/T/open-uri20120613-27204-i6cldv>

Because there is no extension on the temp file paperclip is saving the file without one resulting in issues.

Has anyone run into this issue? I've seen multiple answers about using paperclip to store images from a URI but none seem to address the same problem we're running

like image 348
Jimmy Avatar asked Jun 13 '12 13:06

Jimmy


2 Answers

Don't use the temporary file! It's there as a placeholder as the file is read from the port, and should be considered a private resource for OpenURI. Instead, use open(url).read and work with the resulting content by saving it.

Do something like:

require 'uri'
require 'open-uri'

url = 'http://www.iana.org/domains/example/index.html'
filename = File.basename(URI.parse(url).path)
File.open(filename, 'wb') do |fo|
  fo.write(open(url).read)
end

Temporarily spooling to disk during an operation, especially a network operation, is common. Once the file's content has been accumulated, then it is available to be passed off to the app. read is blocking, so your code will stop there until the file is returned to you. Then you can play with it.

like image 102
the Tin Man Avatar answered Oct 16 '22 20:10

the Tin Man


Extension isn't important for temporary file, but if you want use this file in code or save to another place. You can do it:

temp_file = open(params[:url])
def temp_file.original_filename; File.basename(base_uri.path); end

Now, you can save this temporary file to permanent space or use it in code; Original filename will be used automatically.

like image 42
Sergey Khomushin Avatar answered Oct 16 '22 19:10

Sergey Khomushin