CarrierWave how to store file at given url

2019-02-02 06:16发布

问题:

I have CarrierWave working fine through the typical ORM setup and upload via form. I would like to figure out how to use CarrierWave outside of the form submission context. For example, when a user registers I would like to grab their gravatar and store it with CarrierWave. Here's what I have, and it does not work:

gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"

uploader = ImageUploader.new
uploader.store! gravatar_url

No error either. I've been looking around the web and have not been able to find a solution.

回答1:

I've had lots of trouble trying to figure out how to get store! to work with local file paths. It turns out that store! actually takes a file as a parameter, not a string.

For the URL, you'll need to require 'open-uri' first, then open the file/url. Something like this should work:

require 'open-uri'
gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
tempfile = open(gravatar_url)    

uploader = ImageUploader.new
uploader.store! tempfile

The same will work with a file path, but you don't have to require open-uri in that case.



回答2:

in the controller after user sign up (assuming your user image field is called simply 'image')

gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
@user.remote_image_url = gravatar_url
@user.save 

i think this is the best way according to carrierwave docs and some searching around.

enjoy!



回答3:

Actually you can do this using the built in remote_{attribute}_url property if you are using the active record/model helpers (see the CarrierWave railscast for the details). However, I dug around in the source code a bit to see how this actually works and it appears that even if you are not you should be able to use the following:

uploader = ImageUploader.new
uploader.download! some_remote_url
uploader.store!

Give it a try.