【问题标题】:Dynamic EC2 Bucket Options for Fog/CarrierwaveFog/Carrierwave 的动态 EC2 存储桶选项
【发布时间】:2012-03-21 03:16:30
【问题描述】:

我有一个 Rails3 应用程序,它使用 Carrierwave 和 Fog 将数据存储到 Amazon 的 S3。我正在构建的这个应用程序要求我允许每个用户拥有自己的安全 EC2 存储桶。该应用程序的前提是用户将创建一个帐户(设计),并且我将在我的应用程序的 EC2 用户和密码下为该用户生成一个存储桶。根据当前文档,我还没有看到拥有多个存储桶的方法,因为这是在 FOG YML 中配置的。我想要求根据用户属性动态设置此 FOG_DIRECTORY 的替代方法。

我知道有一种方法可以管理动态文件夹,但这不起作用,因为我需要用户专用的存储桶。

提前致谢!

【问题讨论】:

  • 您能详细说明为什么不能使用动态文件夹吗?您的用户是否需要直接访问,而不是通过您的应用程序?如果没有,签名的网址很好用。
  • 目前 FOG 目录设置在我的雾 yml 中。我想在用户级别存储存储桶 ID。当我需要存储一些信息时,我会查找用户并找到要使用的存储桶 id。我的问题是如何在配置 yml 之外设置这个雾目录?

标签: ruby-on-rails-3 carrierwave fog


【解决方案1】:

假设您的存储桶已经存在。 请尝试以下操作:

#config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  #...other configuration stuff...
  config.fog_directory = 'null.example.com'

  config.fog_host = proc do
    proc do |file|
      uploader = file.instance_variable_get :@uploader
      "http://#{uploader.fog_directory}"
    end
  end
end

请注意嵌套的过程,在撰写此答案时,carrierwave 的文档不正确。如果您希望fog_host 是动态的,则必须包装proc,以便carrierwave 配置类执行正确的操作。

即使fog_directory 是稍后动态设置的。如果没有在初始化程序中设置某些内容,测试框架等会抱怨(它工作正常,设置总是被覆盖)。

#app/controllers/application_controller.rb

before_filter :set_bucket

def set_bucket
  CarrierWave.configure do |config|
    config.fog_directory = "#{current_user.id}.bucket.example.com"
  end
end

更改 set_bucket 函数以适合您的存储桶命名约定。

如果您希望在开发中使用固定存储桶而不是每个用户一个存储桶,您可以添加一些条件逻辑。

另外this 博客文章概述了另一种方法。

【讨论】:

    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多