Save image from URL by paperclip

Ruby on-RailsRubyUploadPaperclip

Ruby on-Rails Problem Overview


Please suggest me a way to save an image from an URL by Paperclip.

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

In Paperclip 3.1.4 it's become even simpler.

def picture_from_url(url)
  self.picture = URI.parse(url)
end

This is slightly better than open(url). Because with open(url) you're going to get "stringio.txt" as the filename. With the above you're going to get a proper name of the file based on the URL. i.e.

self.picture = URI.parse("http://something.com/blah/avatar.png")

self.picture_file_name    # => "avatar.png"
self.picture_content_type # => "image/png"

Solution 2 - Ruby on-Rails

Here is a simple way:

require "open-uri"

class User < ActiveRecord::Base
  has_attached_file :picture

  def picture_from_url(url)
    self.picture = open(url)
  end
end

Then simply :

user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"

Solution 3 - Ruby on-Rails

It didn't work for me until I used "open" for parsed URI. once I added "open" it worked!

def picture_from_url(url)
  self.picture = URI.parse(url).open
end

My paperclip version is 4.2.1

Before open it wouldn't detect the content type right, because it wasn't a file. It would say image_content_type: "binary/octet-stream", and even if I override it with the right content type it wouldn't work.

Solution 4 - Ruby on-Rails

First download the image with the curb gem to a TempFile and then simply assign the tempfile object and save your model.

Solution 5 - Ruby on-Rails

Into official documentation is reported here https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL

Anyway it seems not updated, because in last version of paperclip something has changed and this line of code is no more valid:

user.picture = URI.parse(url)

It raise an error, in particular this error is raised:

Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...

The new correct syntax is this one:

url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })

Also we need to add these lines into config/initializers/paperclip.rb file:

Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register

Tested this with paperclip version 5.3.0 and it works.

Solution 6 - Ruby on-Rails

It may helpful to you. Here is the code using paperclip and image present in remote URL .

require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))

In model

class Model < ActiveRecord::Base
  has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end

Solution 7 - Ruby on-Rails

As those are old Answer's here's a newer one:

Add Image Remote URL to your desired Controller in the Database

$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate

Edit your Model

attr_accessible :description, :image, :image_remote_url
.
.
.
def image_remote_url=(url_value)
  self.image = URI.parse(url_value) unless url_value.blank?
  super
end

*In Rails4 you have to add the attr_accessible in the Controller.

Update your form, if you allow other to upload an Image from a URL

<%= f.input :image_remote_url, label: "Enter a URL" %>

Solution 8 - Ruby on-Rails

This is a hardcore method:

original_url = url.gsub(/\?.*$/, '')
filename = original_url.gsub(/^.*\//, '')
extension = File.extname(filename)

temp_images = Magick::Image.from_blob open(url).read
temp_images[0].write(url = "/tmp/#{Uuid.uuid}#{extension}")

self.file = File.open(url)

where Uuid.uuid just makes some random ID.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkhanhView Question on Stackoverflow
Solution 1 - Ruby on-RailsAditya SanghiView Answer on Stackoverflow
Solution 2 - Ruby on-RailsNicolas BlancoView Answer on Stackoverflow
Solution 3 - Ruby on-RailsMïchael MakarövView Answer on Stackoverflow
Solution 4 - Ruby on-RailsAriejanView Answer on Stackoverflow
Solution 5 - Ruby on-RailsDiego DView Answer on Stackoverflow
Solution 6 - Ruby on-RailsprabuView Answer on Stackoverflow
Solution 7 - Ruby on-RailsMini JohnView Answer on Stackoverflow
Solution 8 - Ruby on-RailsMartin StreicherView Answer on Stackoverflow