【问题标题】:Carrierwave/Fog Ruby on Rails gem will not upload files to Amazon S3Carrierwave/Fog Ruby on Rails gem 不会将文件上传到 Amazon S3
【发布时间】:2014-11-13 07:11:51
【问题描述】:

我已经浏览了 railscast 并在 StackOverflow 上进行了研究。尽管我发现其他人有同样的问题,但我研究过的任何其他解决方案似乎都不起作用。我已经尝试了其他帖子中建议的代码的多种变体......没有运气。

我正在尝试通过 CarrierwaveFog gem 将 PDF 文件上传和存储到 Amazon S3,但无济于事。虽然我在生产中使用Heroku,但我还没有尝试将它部署到 Heroku,因为我什至无法让它在本地工作。返回的错误是

缺少必需的参数:aws_access_key_id、aws_secret_access_key

我该如何解决这个问题?

carrierwave.rb(初始化器)

CarrierWave.configure do |config|
    config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: ENV['MY_KEY_ID'],
        aws_secret_access_key: ENV['MY_KEY']
    }

    config.fog_directory  = ENV['MY_BUCKET']
    config.fog_public     = false
end

pdf_uploader.rb:

class PdfUploader < CarrierWave::Uploader::Base
    storage :fog

    include CarrierWave::MimeTypes
    process :set_content_type

    def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end
end

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    我遇到了同样的问题,将变量包装在字符串上对我来说很重要。

    我使用"#{Rails.application.secrets.aws_access_key_id}" 代替Rails.application.secrets.aws_access_key_id 来确保将值作为字符串插入。

    这是我的初始化程序:

    CarrierWave.configure do |config|
      config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: "#{Rails.application.secrets.aws_access_key_id}",
        aws_secret_access_key: "#{Rails.application.secrets.aws_secret_access_key}"
      }
      config.fog_directory  = Rails.application.secrets.aws_s3_bucket
      config.fog_public     = true
      config.fog_attributes = { 'Cache-Control'=>'max-age=315576000' }
    end
    

    这是我的 secrets.yml:

    development:
      secret_key_base: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
      aws_access_key_id: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
      aws_secret_access_key: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
      aws_s3_bucket: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
    production:
      secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
      aws_access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
      aws_secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
      aws_s3_bucket: <%= ENV['AWS_BUCKET_NAME'] %>
    

    【讨论】:

    • 很好的答案@rebagiatte。我在过去遇到过问题,并没有考虑引用它们。我将补充一点,可以将非秘密配置数据保存在您的配置环境文件(即 application.rb、development.rb 等)中。它们可以像这样添加:config.aws_s3_bucket='xxxxx'。您可以像这样在您的应用中访问它们的值:Rails.application.config.aws_s3_bucket.
    【解决方案2】:

    将 key_id、key 和存储桶设置为环境变量时似乎存在问题。一旦我将 所有三个 更改为字符串常量,它似乎工作正常。我还部署到 Heroku 并验证了生产中的功能。

    最终的初始化文件:

    CarrierWave.configure do |config|
        config.storage = :fog
        config.fog_credentials = {
            provider: 'AWS',
            aws_access_key_id: 'MY_KEY_ID_HERE',
            aws_secret_access_key: 'MY_KEY_HERE'
        }
    
        config.fog_directory  = 'MY_S3_BUCKET_HERE'
        config.fog_public     = false
    end
    

    【讨论】:

      【解决方案3】:

      这个错误可能意味着ENV['MY_KEY_ID']ENV['MY_KEY']nil

      尝试将这些值替换为您从 Amazon AWS 我的帐户页面获得的字符串。

      所以:

      CarrierWave.configure do |config|
          config.fog_credentials = {
              provider: 'AWS',
              aws_access_key_id: "YOUR ACCESS KEY ID",
              aws_secret_access_key: "YOUR SECRET KEY"
          }
      
          config.fog_directory  = "YOUR BUCKET NAME"
          config.fog_public     = false
      end
      

      【讨论】:

      • MY_KEY_IDMY_KEY 占位符已替换为我的实际 ID 和密钥。我只是不想公开这些信息
      • 可以理解,但这就是错误表明它们为零。它们是代码中的常量字符串还是来自其他地方?
      • 这些是字符串常量......也许有一种方法可以删除初始化程序的表单并将其直接带到控制器级别??我猜这不推荐但是..有什么想法吗?
      【解决方案4】:

      我遇到了与中间人设置类似的问题。

      在控制台中我做了AWS_ACCESS_KEY='xxxxxx',在我的配置文件中我有ENV['AWS_ACCESS_KEY']。它没有用。但是export AWS_ACCESS_KEY='xxxxx' 使配置文件起作用。这是因为“导出标记要传递给环境中的子进程的每个名称”。而第一个没有。

      希望您有同样的问题,这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-06-29
        • 2012-07-08
        • 2012-01-08
        • 2013-08-27
        • 2019-06-06
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        相关资源
        最近更新 更多