【问题标题】:Rails + Paperclips + Rackspace CloudFiles with the Private CDNRails + Paperclips + Rackspace CloudFiles 和私有 CDN
【发布时间】:2014-04-03 18:56:25
【问题描述】:

我有一个 Rails 应用程序,它使用 Paperclip 处理上传的文件,我们目前由 Rackspace 托管。

应用程序目前托管在单个服务器上,我正在构建一个具有负载平衡器、应用程序服务器和单独数据库服务器的更具可扩展性的解决方案。我需要做的最后一件事是上传资产的解决方案。我曾尝试使用 Rackspace 的 CloudFiles,但似乎使用回形针和 CloudFiles 的唯一方法是将它们放在我无法使用的公共 CDN 上,用户需要经过身份验证才能访问文件。在我转向 Amazon S3 之前,由于他们可以选择临时 URL,是否知道如何将 CloudFiles 与 Paperclip 一起使用并需要身份验证才能访问文件?

我们将不胜感激任何帮助、提示、谷歌搜索、链接或解决方案。

【问题讨论】:

  • 非常有趣的问题/想法。我在工作时使用相同的设置在我们的应用程序中上传客户端文件:Rackspace、Paperclip 和 Rials (v3.2.17),但不必实施此安全措施。我在雾 Github 网站上找到了这个用于创建私有目录的示例:github.com/fog/fog/blob/master/lib/fog/rackspace/examples/…(想知道这是否会引导你走上必要的道路?)

标签: ruby-on-rails paperclip rackspace-cloud fog cloudfiles


【解决方案1】:

碰巧的是,Cloud Files also supports 生成临时 URL 和 it appears that Paperclip does allow you to make use of it。只需在您的视图中使用 #expiring_url 而不是 #url 从您的 Attachment 生成 URL:

= image_tag @organization.logo.expiring_url(Time.now.to_i + 100, :original).gsub(/^http:/, "https")

Paperclip 将 only generate http urls,但由于 Rackspace 的临时 URL 不会在其校验和中使用该方案,您可以使用 gsub 调用将其转换为 https URL。另外,请注意#expiring_url 的第一个参数是一个绝对 时间戳(以秒为单位)。

Rackspace 的过期 URL 只是在最近才变得模糊 - v1.18.0 - 所以如果您使用的是旧版本,您可能需要升级模糊以利用它们:

bundle upgrade fog

Paperclip 还支持generating obfuscated URLs,看起来很有趣,但安全性较低,因为服务器不会过期。

【讨论】:

  • 嘿,非常感谢您的回复。它让我大部分时间都在那里。我现在可以获得文件的实际 url,但是当图像尝试加载“net::ERR_CONNECTION_REFUSED”时出现错误。我想我必须设置 rackspace_temp_url_key 但我不知道如何设置。有什么想法吗?
  • Paperclip 按原样传递:fog_credentialsFog::Storage,所以你应该可以将它添加到那里::fog_credentials => { :provider => 'rackspace', ..., :rackspace_temp_url_key => ENV['SUPER_SECRET_KEY'] }
  • 我已经添加了临时 url 键,但现在我似乎无法弄清楚如何设置键。
  • 这应该是您唯一需要设置它的地方 :-) Fog 会记住您在 Paperclip 实例化 Fog::Storage 时设置的临时 URL 密钥,并使用它在临时 URL 中生成签名。您仍然无法使用expiring_url 下载它们吗?
  • 我已经能够在那里添加它并且我得到了一个链接,但我还不能在 Rackspace 端添加它。如果我找到解决方案,我会更新此评论。再次感谢。
【解决方案2】:

您可以像这样添加密钥:

class Rackspace

  def self.add_temp_url_key
    require 'fog'

    puts "Creating Storage Service"

    begin
      service = Fog::Storage.new(
        :provider => 'rackspace',
        :rackspace_username => ENV['FOG_USERNAME'],
        :rackspace_api_key => ENV['FOG_API_KEY'],
        :rackspace_region => ENV['RACKSPACE_REGION'].to_sym
      )

      service.post_set_meta_temp_url_key(ENV['RACKSPACE_TEMP_URL_KEY'])
      puts "X-Account-Meta-Temp-Url-Key successfully set to #{ENV['RACKSPACE_TEMP_URL_KEY']}"

    rescue => e
      puts "Unable to set X-Account-Meta-Temp-Url-Key - #{e.inspect}"
      puts e.backtrace
    end
  end

end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2018-07-20
    • 1970-01-01
    相关资源
    最近更新 更多