rails使用S3和cloudfront配置carrierwave

时间:2016-04-04 10:38:17

标签: ruby-on-rails amazon-web-services amazon-s3 carrierwave amazon-cloudfront

我有一个rails4应用,我试图将CDN添加到S3上传。由于某种原因,它不起作用。

当我出于某种原因在配置中设置cloudfront时,它仅对属于同一上传者的某些图像(NOT ALL)有效,并且最重要的是这些图像被破坏。从S3显示的图像正常工作,但它们也应该从cloudfront提供。

我错过了什么?

通过cloudfront显示(损坏)的图像:

<%= image_tag current_user.avatar.url(:small_thumb), class: 'navbar-avatar', alt: "#{current_user.first_name}'s_avatar", title: "#{current_user.first_name}'s avatar" %>    

https://xyz.cloudfront.net/images/xyz.cloudfront.net/uploads/profile/avatar/3/small_thumb_3f4ff02.jpg

来自同一上传者的图片由于某种原因从S3显示而不是cloudfront(显示未被破坏)

<%= image_tag post.user.avatar.url(:base_thumb), class: 'post-avatar' %>

https://eaxmple.s3.amazonaws.com/uploads/profile/avatar/10/base_thumb_john_smith.png

配置:

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider:              'AWS',
    aws_access_key_id:     ENV['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']                        
  }
  config.fog_directory  = ENV['S3_BUCKET_NAME']
  config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" }
  config.asset_host = ENV['CLOUDFRONT_URL']
end

avatar_uploader.rb

if Rails.env.production?
  storage :fog
else
  storage :file
end

的Gemfile

gem 'carrierwave', '~> 0.10.0'
gem 'fog', '~> 1.34.0'
gem 'mini_magick', '~> 4.3.3'

更新

上传者默认存储空间:

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

我该如何改变:

https://xyz.cloudfront.net/images/xyz.cloudfront.net/uploads/profile/avatar/3/small_thumb_3f4ff02.jpg

到此:

https://xyz.cloudfront.net/uploads/profile/avatar/3/small_thumb_3f4ff02.jpg

1 个答案:

答案 0 :(得分:1)

您可能需要将协议添加到您的Cloudfront网址:

 <td class="col-md-2" width="50" style="background-color: transparent;">
<input class="btn btn-sm btn-primary fa" id='iedit-@item.ID' type="button" value="&#xf040"  onclick='showedit("@(item.ID)");' />
</td>