301 S3上传后永久移动

我试图使用carrierwave和雾gem将图像上传到Ruby on Rails上的S3,正确上传图像但是当我尝试保存包含刚刚上传的图像信息的模型时我得到了这个错误:

Excon::Errors::MovedPermanently in UserController#show app/models/user.rb:46:in `process_image_with_key' app/controllers/user_controller.rb:12:in `show' <Excon::Response:0x007f97846a3c18 @body="\nPermanentRedirectThe bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. 

用户模型:

 mount_uploader :image, AvatarUploader def image_name File.basename(image.path || image.filename) if image end def process_image_with_key( key ) unless key.nil? self.key = key self.remote_image_url = self.image.direct_fog_url(with_path: true) self.save! end end 

AvatarUploader:

 # encoding: utf-8 class AvatarUploader < CarrierWave::Uploader::Base include CarrierWaveDirect::Uploader include CarrierWave::RMagick # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility: include Sprockets::Helpers::RailsHelper include Sprockets::Helpers::IsolatedHelper include CarrierWave::MimeTypes process :set_content_type version :thumb do process resize_to_fill: [50, 50] end end 

用户控制器

 def show @user = User.find_by_id(params[:id]) @user.process_image_with_key(params[:key]) @uploader = User.new.image @uploader.success_action_redirect = user_url(@user.id) end 

carriwerwave初始化器

 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'], :region => 'us-west-1' } config.fog_directory = ENV['AWS_FILE_BUCKET'] config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} end 

的Gemfile

 gem 'carrierwave' gem 'rmagick' gem 'fog' gem 'carrierwave_direct' 

 PermanentRedirectThe bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. 

这是一个经常遇到的问题:您正在尝试访问us-west-1区域中的存储桶,但是,由于遗留原因,大多数/所有AWS开发工具包中的默认Amazon S3区域都是美国标准 ,它会自动将请求路由到Northern的设施弗吉尼亚州或太平洋西北地区使用网络地图 (有关详细信息,请参阅地区和终点 )

因此,您只需在使用S3 API之前明确指定存储桶区域的端点,例如对于us-west-1

  config.fog_credentials = { :provider => 'AWS', :aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'], :aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'], :region => 'us-west-1' :endpoint => 'https://s3-us-west-1.amazonaws.com/' } 

再次感谢Steffen Opel !

但是我没有做过一些考虑,我的区域是美国标准,因此,我的carrierwave初始化程序看起来像这样:#:region =>#NOT USEDEDED by US STANDARD:endpoint =>’ https://s3.amazonaws.com

这个链接是关键:D