基于request.ssl动态地通过HTTPS提供文件?与Attachment_fu

时间:2009-09-07 10:35:51

标签: ruby-on-rails ruby ssl amazon-s3 attachment-fu

我看到:user_ssl中有一个attachment_fu选项,用于检查amazon_s3.yml文件,以便通过https://

提供文件

在s3_backend.rb中你有这个方法:

    def self.protocol
      @protocol ||= s3_config[:use_ssl] ? 'https://' : 'http://'
    end

但是这会使它通过SSL服务所有s3附件。如果当前请求是使用https://即:

进行的,我想使其动态化
  if request.ssl?
    @protocol = "https://"
  else
    @protocol = "http://"  
  end

我怎样才能让它以这种方式运作?我已经尝试修改方法,然后得到 NameError:undefined局部变量或方法`request'for Technoweenie :: AttachmentFu :: Backends :: S3Backend:Module error

2 个答案:

答案 0 :(得分:0)

问题是您正在修改的方法(Technoweenie::AttachmentFu::Backends::AWS::S3.protocol)是静态的,无法访问相关文件或请求。您要修改的是Technoweenie::AttachmentFu::Backends::AWS::S3#s3_url(thumbnail)。你必须添加一个options参数,这样你的控制器就可以传入它是否需要SSL,因为这个模型级包不了解像“当前请求”这样的控制器级问题(也不应该)。

但真正的答案是“你可能不想这样做”。如果客户说“我们有免费增值模式,其中只有我们的付费客户获得他们照片的SSL传输”,那么你应该回过头来说:“实际上更难瘫痪SSL文件传输,它是我们可能只会提出另一种免费增值方案。“如果客户不在乎,您也可以为所有上传功能启用SSL。

答案 1 :(得分:0)

这是一个需要正确解决的重要问题,或者影响非常严重(特别是如果你不在IE中测试,错误和警告可能会被你忽略)。我的解决方案是将以下内容放在ApplicationController

around_filter :set_attachment_fu_protocol

def set_attachment_fu_protocol
  protocol = Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_get(:@protocol)
  Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_set(:@protocol, request.protocol)
  yield
ensure
  Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_set(:@protocol, protocol)
end

此解决方案旨在具有以下属性:

  • 不需要修补attachment_fu
  • 为每个请求设置S3后端协议
  • 即使发生异常,也会重置协议
  • 如果从控制台运行,则保留默认值:use_ssl设置
  • 不要求around_filter是通用的,因为它总是在每次请求后将其重置为原始状态