首页 > 解决方案 > 如何使用carrierwave获取S3私有存储桶中对象的访问url

问题描述

我正在使用策略为“桶和对象不公开”的carrierwave将我的文件上传到s3的私有桶。

现在,当我尝试@docuemnt.pdf_file.url 在该私有存储桶中为我的对象生成访问 url 时,bucket_name is required即使在传递存储桶名称后,我也会收到一条错误消息“”,因为@docuemnt.pdf_file.url 'privatebucketname'我收到一条错误消息“ ArgumentError: Version privatebucketname doesn't exist!”。

我应该如何获取 url 以使用载波从我的 rails 应用程序中访问私有存储桶对象。

我的上传代码如下:

class SecureUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick


  storage :fog

  def fog_directory
    ENV['AWS_SECURED_BUCKET']
  end

  def fog_public
    false
  end

  def fog_authenticated_url_expiration
    1.minutes # in seconds from now,  (default is 10.minutes)
  end
end

我的carrierwave配置如下:

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider:               'AWS',
    aws_access_key_id:      ENV['AWS_KEY'],
    aws_secret_access_key:  ENV['AWS_SECRET'],
    region:                 ENV['AWS_REGION']
  }

  # For testing, upload files to local `tmp` folder.
  if Rails.env.test? || Rails.env.cucumber?
    config.storage           = :file
    config.enable_processing = false
    config.root              = "#{Rails.root}/tmp"
  else
    config.storage = :fog
  end

  config.cache_dir        = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on Heroku
  config.fog_directory    = ENV['AWS_BUCKET']
end

标签: ruby-on-railsamazon-s3carrierwave

解决方案


我通常有一个初始化程序carrierwave.rb并将配置保留在那里。

CarrierWave.configure do |config|
  if Rails.env.production?
    config.fog_provider = 'fog/aws'
    config.enable_processing = true
    config.fog_directory = Rails.application.credentials.aws[:bucket]
    config.fog_public = false # optional, defaults to true
    config.fog_attributes = { "Cache-Control" => "max-age=315576000" }

    config.fog_credentials = {
      provider: "AWS",
      aws_access_key_id: Rails.application.credentials.aws[:access_key_id]
      aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key]
      region: Rails.application.credentials.aws[:region]
    }
    config.storage = :fog
  else
    config.enable_processing = false
    config.storage = :file
  end
end

推荐阅读