首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shrine验证文件扩展名不允许使用Facebook图像

Shrine验证文件扩展名不允许使用Facebook图像
EN

Stack Overflow用户
提问于 2021-06-18 00:47:42
回答 1查看 52关注 0票数 0

我在我的项目中使用Srhine作为图像,使用Omniauth gems通过Google和Facebook进行日志记录。

我从Omniauth提供程序获取数据的方法是标准的:

代码语言:javascript
复制
  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.name = [auth.info.first_name, auth.info.last_name].join(" ")
      user.password = Devise.friendly_token[0, 20]
      user.avatar_remote_url = auth.info.image
    end
  end

它允许我通过谷歌和Facebook登录,并获得用户数据,姓名和图像。我也有标准的注册和更新user.avatar的可能性,所以我想验证图像,使其具有有限的大小,因此扩展也是有限的。我在我的Uploader类中编写了以下验证:

代码语言:javascript
复制
  Attacher.validate do
    validate_max_size 2*1024*1024
    # validate_extension %w[jpg jpeg png webp]
  end

问题是,扩展的验证不允许通过Facebook注册新用户。在FB的情况下,auth.info.image并不是真的返回一个指向像'https://blabla/image.jpg'这样的图像的链接,而是创建一个链接,当你将它粘贴到浏览器中时,会导致图像直接下载到硬盘上。我如何编写此验证,以便它允许以FB方式提供要保存的图像?或者,我如何跳过Omniauth方法中的验证?

EN

回答 1

Stack Overflow用户

发布于 2021-06-20 04:50:26

您可以在附加文件之前在Shrine::Attacher上下文散列中设置自定义标志:

代码语言:javascript
复制
def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.name = [auth.info.first_name, auth.info.last_name].join(" ")
    user.password = Devise.friendly_token[0, 20]
    user.avatar_attacher.context[:omniauth] = true # <=== set the flag
    user.avatar_remote_url = auth.info.image
  end
end

然后,在validate块中,如果存在该标志,则可以访问它并跳过扩展验证:

代码语言:javascript
复制
Attacher.validate do
  validate_max_size 2*1024*1024
  validate_extension %w[jpg jpeg png webp] unless context[:omniauth]
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68023473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档