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

我通过典型的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 

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

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

对于URL,您需要首先require 'open-uri' ,然后打开文件/ url。 像这样的东西应该工作:

 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

在用户注册后在控制器中(假设您的用户图像字段简称为“图像”)

 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文档和一些搜索的最佳方式。

请享用!

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

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

试试看。