2014-04-03 49 views
1

我有一个Rails应用程序,它使用Paperclip处理上传的文件,我们目前由Rackspace托管。Rails +回形针+ Rackspace CloudFiles私人CDN

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

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

+0

真的很有趣的问题/想法。我使用这个相同的设置在工作中上传我们的应用程序中的客户端文件:Rackspace,Paperclip和Rials(v3.2.17),但不必执行此安全措施。我在迷雾Github网站上找到了这个例子来创建一个私人目录:https://github.com/fog/fog/blob/master/lib/fog/rackspace/examples/storage/create_private_directory.rb(想知道这是否会导致你走下了必要的路?) –

回答

1

碰巧,Cloud Files also supports生成临时URL,并且it appears that Paperclip does allow you to make use of it。只需通过您的Attachment网址与#expiring_url,而不是#url在您的看法:

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

回形针将only generate http urls,但由于Rackspace的临时网址没有在他们的校验和使用方案,您可以使用gsub呼叫转它变成一个https网址。另请注意,#expiring_url的第一个参数是绝对时间戳(以秒为单位)。

到期网址,Rackspace公司只是把它做成雾最近有点 - v1.18.0 - 所以,如果你使用的是旧版本,您可能需要升级雾利用这些优势:

bundle upgrade fog 

回形针也支持generating obfuscated URLs,看起来很有趣,但是不太安全,因为服务器不会过期。

+0

嘿,非常感谢你的回应。它使我获得了大部分途径。我现在可以获取文件的实际URL,但是当图像尝试加载“net :: ERR_CONNECTION_REFUSED”时出现错误。我想我必须设置rackspace_temp_url_key,但我不知道如何。有任何想法吗? – ehay

+0

回形针将':fog_credentials'按原样传递给'Fog :: Storage',所以您应该可以在其中添加:':fog_credentials => {:provider =>'rackspace',...,:rackspace_temp_url_key => ENV ['SUPER_SECRET_KEY']}' –

+0

我已经添加了临时url密钥,但现在我似乎无法弄清楚如何设置密钥。 – ehay

0

您可以添加的关键是这样的:

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