2012-12-03 21 views
10

Próbuję przesłać obrazy do S3 na Ruby on Rails przy użyciu maskotek nośnych i mgieł, obrazy są przesyłane poprawnie, ale kiedy próbuję, zapisz model zawierający informacje o obrazie, który został właśnie przesłany. błąd:301 Przeniesiono Trwale po przesłaniu 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="<?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> 

modelu użytkownika:

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 

kontroler użytkownika

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 initializer

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' 

Odpowiedz

24
<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> 

Jest to często spotykane problem: Próbujesz uzyskać dostęp do wiadra w regionie nas- zachodni-1, jednak ze względu na starszą wersję e domyślny Amazon S3 regionem najbardziej/all AWS SDKs jest normą USA, który automatycznie kieruje wnioski do obiektów w Północnej Wirginii i północno-zachodniego Pacyfiku z wykorzystaniem sieci odwzorowuje (patrz Regions and Endpoints szczegółów).

Dlatego wystarczy określić punkt końcowy regionu zasobników jawnie przed użyciem interfejsu API S3, np. dla us-zachód-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/' 
    } 
+0

Dzięki! To działa! Ale niektóre uwagi nie zrobiłem, a będę wyjaśnione poniżej ... – p1nox

+0

Nawiasem mówiąc, mam dziwny komunikat sprawdzania poprawności na przesyłanie zdalnego obrazu z Facebook/Twitter użytkowników, nie wiem, czy masz kilka minut na obejrzenie go [Pytanie o StackOverflow] (http://stackoverflow.com/questions/13730976/image-invalid-on-facebook-twitter-user-image-uploading-to-s3) – p1nox

+1

To doprowadziło mnie do odpowiedzi - Zabawne jednak - region w url mojego wiadra w konsoli aws był inny od regionu wymienionego pod właściwościami - więc słowo mądry - sprawdź dokładnie to. Rozwiązał ten problem dla moi. –

1

Dzięki ponownie do Steffen Opel!

Ale niektóre uwagę, że nie dokonały, mój region US Standard, dlatego moja carrierwave initializer wygląda następująco: #: Region => # nie są konieczne dla standardu USA : punkt końcowy => 'https://s3.amazonaws.com'

Ten klucz był: link: D

Powiązane problemy