Question

I am using a supplier's api and the response they send to our server includes a url to a file, upon trying to save this file locally I fail miserably.

def self.create_file_new(filename, ext, url)
  require 'open-uri'

  file = Tempfile.new(filename + ext) 
  file.binmode

  # data = open(url).read
  # data = open(url, :http_basic_authentication => [username, password])

  file << open(url, :http_basic_authentication => [username, password]).read
  # file.write CGI::unescape(data)

  file.close
  file = File.open(file.path)

  return file
end

I was originally getting a OpenURI::HTTPError (401 Unauthorised): but I have since created a file named bypass_ssl_verification_for_open_uri in app/initializers containing the following:

# Make open-uri work with https
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

which I found whilst Googling on how to fix it.

I then started to get this error message: NoMethodError (undefined method 'tr' for #<StringIO:0xb5b728c4>):, I tried creating another file (cgi_escape_fix.rb in app/initializers) containing this:

require 'cgi'
class << CGI
  alias_method :orig_escape, :escape
  def escape(str)
    orig_escape(str.to_str)
  end
end

Which I also found on my Google travels but that doesn't seem to have solved anything, so I commented out the file.write CGI::unescape(data) to try a different way but still no joy.

Now in the log I am just getting a plain 500 Internal Server Error with no useful information.

The file I'm attempting to save will always be a pdf.

Ruby 1.8.7

Rails 2.3.14

Was it helpful?

Solution

Got it to work with the following (two new initializer scripts removed):

file = Tempfile.new(filename + ext) 
file.binmode
file << open(url, :http_basic_authentication => [username, password]).read
file.close
file = File.open(file.path)

return file

Should also mention that this is being passed to the attachment_fu plugin incase anyone else has problems with it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top