40

I just wanted to know how one would go about uploading a remote file url using Carrierwave in the Rails console.

I tried the following without any luck. I presume it's not processing the Uploader?

user = User.first
user.remote_avatar_url = "http://www.image.com/file.jpg"
user.save

Many thanks

Wasabi Developer
  • 3,523
  • 6
  • 36
  • 60

5 Answers5

27

Take a look at the 'Uploading files from a remote location' section on this page https://github.com/carrierwaveuploader/carrierwave

CarrierWave should throw an error if the url of the location is invalid

2.1.3 :015 > image.remote_image_url = "http"
 => "http"
2.1.3 :016 > image.save!
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image trying to download a file which is not served over HTTP

Or if it's an unknown host:

2.1.3 :017 > image.remote_image_url = "http://foobar"
=> "http://foobar"
2.1.3 :018 > image.save!
   (0.4ms)  BEGIN
   (0.4ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image could not download file: getaddrinfo: nodename nor servname provided, or not known

Please also note that if you want to download remote images you should prefix the attribute with remote_ and suffix it with _url, as shown in the example

  • I am facing issue that it's working fine when creating new entry and saving remote URL with `image.remote_image_url = "somevalidurl"` but when updating it's not updating new image. – Manwal Jul 10 '19 at 07:48
7
user = User.first
user.remote_avatar = File.open(FILE_LOCATION)
user.save

FILE_LOCATION can be

File.join(Rails.root, '/files/png-sample.png')

if file is found in a folder 'files' in rails project

Oss
  • 4,232
  • 2
  • 20
  • 35
  • the question is how can I upload a file from a REMOTE LOCATION (a remote URL). Not a file on my system. – Jason FB Oct 17 '14 at 15:17
  • 1
    if so then just use the method `user.remote_avatar_url = "www.example.com/image.jpg`, Carrierwave will simply download the file and add re-upload it on your application. – Oss Oct 18 '14 at 01:30
5

I was facing the same problem. and the issue might be http is redirecting to https. So I replaced them using gsub as follows:

image.remote_image_url = remote_image_url.gsub('http://','https://')
image.save!

this should most probably solve the problem.

Subhash Chandra
  • 3,165
  • 1
  • 27
  • 30
-1

Is work as:

url='http://host.domain/file.jpg'    
time=Time.now.to_i.to_s
myfile=IO.sysopen("tmp/"+time+"_img."+url.split(".").last,"wb+")
tmp_img=IO.new(myfile,"wb")
tmp_img.write open(URI.encode(url)).read

if File.exist?("tmp/"+time+"_img."+url.split(".").last)
  "tmp/"+time+"_img."+url.split(".").last
  image = ActionDispatch::Http::UploadedFile.new(:tempfile => tmp_img, :filename => File.basename(tmp_img))
else 
  image=nil
end
@your_model.image=image
@your_model.save
-1

I have had problems with remote_avatar_url not uploading the image or throwing any errors. For me, as far as I can tell, it was because I set the following in my model.

attr_accessor :remote_avatar_url

Carrierwave covers this for you, and although I don't understand why, setting it yourself buggers things up.

hellion
  • 4,602
  • 6
  • 38
  • 77