301 Перемещено навсегда после загрузки S3
Я пытаюсь загрузить изображения на S3 на Ruby on Rails с использованием несущих и туманных камней, изображения загружаются правильно, но когда я пытаюсь сохранить модель, содержащую информацию об только что загруженном изображении, я получаю эту ошибку:
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="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
Модель пользователя:
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'
Ответы
Ответ 1
<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access
must be addressed using the specified endpoint. Please send all future requests to
this endpoint.</Message></Error>
Это часто встречающаяся проблема: вы пытаетесь получить доступ к ведру в регионе us-west-1, однако по старым причинам по умолчанию Amazon S3 в большинстве/всех AWS SDK - это стандарт США, который автоматически направляет запросы на объекты в Северной Вирджинии или на северо-западе Тихого океана с использованием сетевых карт ( см. Регионы и конечные точки).
Поэтому вам просто нужно явно указать конечную точку области ваших регистров перед использованием S3 API, например. для нас-запад-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/'
}
Ответ 2
Еще раз спасибо Steffen Opel!
Но некоторые соображения, которые я не сделал, мой регион - стандарт США, поэтому мой инициализатор несущей выглядит следующим образом: #: region = > # НЕ НУЖЕН СТАНДАРТОМ США : endpoint = > 'https://s3.amazonaws.com'
Эта ссылка была ключом: D