CarrierWave如何在给定的URL上存储文件

时间:2011-09-07 19:56:02

标签: ruby-on-rails carrierwave

我通过典型的ORM设置使CarrierWave正常工作并通过表单上传。我想弄清楚如何在表单提交上下文之外使用CarrierWave。例如,当用户注册时,我想抓住他们的gravatar并将其存储在CarrierWave中。这就是我所拥有的,它不起作用:

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

也没有错误。我一直在寻找网络,但一直无法找到解决方案。

3 个答案:

答案 0 :(得分:45)

用户注册后控制器中的

(假设您的用户图像字段仅称为“图像”)

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 

我认为这是根据carrierwave docs和一些搜索的最佳方式。

享受!

答案 1 :(得分:19)

实际上,如果您使用的是活动记录/模型帮助程序,则可以使用内置的remote_{attribute}_url属性执行此操作(有关详细信息,请参阅CarrierWave railscast)。但是,我在源代码中挖了一下,看看这实际上是如何工作的,看来即使你不是,你也应该能够使用以下内容:

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

试一试。

答案 2 :(得分:16)

我在尝试弄清store!如何使用本地文件路径方面遇到了很多麻烦。事实证明,store!实际上将文件作为参数,而不是字符串。

对于网址,您首先需要require 'open-uri',然后打开文件/网址。这样的事情应该有效:

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

同样适用于文件路径,但在这种情况下您不必要求open-uri