【问题标题】:Upload Facebook profile image with Carrierwave使用 Carrierwave 上传 Facebook 个人资料图片
【发布时间】:2020-01-04 02:46:48
【问题描述】:

我正在尝试将 Facebook 个人资料图片与 Devise 一起使用,并通过 CarrierWave/fog 将其上传到 S3,但我从 Facebook 获得的auth.info.image 中提供的链接是下载文件的链接,而不是图片CarrierWave 可以使用。

如果您在浏览器中访问该链接,则该链接是文件下载链接。我在任何地方都没有看到任何解决这个问题的文章。我以为我可以使用 CarrierWave 将文件下载到/tmp,然后上传,但调用CarrierWave::Uploader::Download 不起作用。或者我看到其他文章解释说您可以保存 Facebook 提供的链接,只需在 = image_tag 中使用它,但这也不起作用。

在我的User 模型中:

def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create! do |user|
      user.email = auth.info.email
      user.provider = auth.provider
      user.first_name = auth.info.first_name
      user.last_name = auth.info.last_name
      user.uid = auth.uid
      user.password = Devise.friendly_token[0, 20]
      user.password_confirmation = user.password
      user.profile_image = auth.info.image
    end
end

user.profile_imagenil。我对 CarrierWave 没有任何问题 - 我已经在其他几个项目中使用它来使用雾保存到 AWS。

我想要 a) 保存一个指向我可以在 Rails 视图中使用的图像的链接,但如前所述,我没有那个 - Facebook 返回的链接是一个下载图像的链接,所以, b) 是下载文件,将文件名保存到User模型并上传文件到AWS。

【问题讨论】:

    标签: ruby facebook devise ruby-on-rails-5 carrierwave


    【解决方案1】:

    使用"#{auth.info.image}?type=large" 而不是auth.info.image

    【讨论】:

      【解决方案2】:

      显然CarrierWave 有它自己的魔力,如果你在字段名称前加上remote_ 并在它后面加上_url,它知道在上传之前下载文件。所以,我的字段名称是profile_image,并且(在我的User 模型中)self.from_omniauth(auth) 方法:

      user.remote_profile_image_url = auth.info.image

      只是工作。字段名称保存了正确的文件名,文件(全尺寸和缩略图)上传到 S3。

      【讨论】:

        猜你喜欢
        • 2014-05-18
        • 2016-05-22
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        相关资源
        最近更新 更多