2012-02-26 11 views
7

stara się szukać przyczyny tego błędu przez dłuższy okres czasu i nie może się znaleźć każdy ...Zamieszczanie Carrierwave z s3 i mgły

Więc mam app szyn, a ja wykorzystać carrierwave na zdjęciach przesyłanie. Chcę też wykorzystać Amazon S3 do przechowywania plików w mojej aplikacji.

Początkowo jako Zajmuję się tworzeniem aplikacji Pozwoliłem załadowania pliku do na na: akt, tj

image_uploader.rb

# Choose what kind of storage to use for this uploader: 
    storage :file 
# storage :fog 

Teraz po skończeniu się rozwój i umieszczenie go na żywo (używam heroku), zdecydowałem się zmienić magazyn nośników danych na S3, aby przetestować go lokalnie.

image_uploader.rb

# Choose what kind of storage to use for this uploader: 
# storage :file 
storage :fog 

Teraz jednak, gdy próbuję załadować zdjęcie (czy to dla awatara użytkownika, etc) pojawia się ten błąd:

Excon::Errors::Forbidden in UsersController#update 
Expected(200) <=> Actual(403 Forbidden) 
request => {:connect_timeout=>60, :headers=>{"Content-Length"=>74577, "x-amz- acl"=>"private", "Content-Type"=>"image/png", "Date"=>"Sun, 26 Feb 2012 10:00:43 +0000", "Authorization"=>"AWS AKIAJOCDPFOU7UTT4HOQ:8ZnOy7X71nQAM87yraSI24Y5bSw=", "Host"=>"s3.amazonaws.com:443"}, :instrumentor_name=>"excon", :mock=>false, :read_timeout=>60, :retry_limit=>4, :ssl_verify_peer=>true, :write_timeout=>60, :host=>"s3.amazonaws.com", :path=>"/uploads//uploads%2Fuser%2Favatar%2F1%2Fjeffportraitmedium.png", :port=>"443", :query=>nil, :scheme=>"https", :body=>"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\xC2\x00\x00\x00\xC3\b\x06\x00\x00\x00\xD0\xBD\xCE\x94\x00\x00\nCiCCPICC Profile\x00\x00x\x01\x9D\x96wTSY\x13\xC0\xEF{/\xBD\xD0\x12B\x91\x12z\rMJ\x00\x91\x12z\x91^E%$\ 
... 
# The code you see above to the far right repeats itself a LOT 
... 
[email protected]\x85\xB5\t\xFC_y~\xA6=:\xB2\xD0^\xBB~i\xBB\x82\x8F\x9B\xAF\xE7\x04m\xB2i\xFF\x17O\x94S\xF7l\x87\xA8&\x00\x00\x00\x00IEND\xAEB`\x82", :expects=>200, :idempotent=>true, :method=>"PUT"} 
response => #<Excon::Response:0x007fc88ca9f3d8 @body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>8EFA56C0DDDC8878</RequestId><HostId>1OxWXppSSUq1MFjQwvnFptuCM3gKOuKdlQQyVSEgvzzv4Aj+r2hSFM2UUw2NYyrR</HostId></Error>", @headers={"x-amz-request-id"=>"8EFA56C0DDDC8878", "x-amz-id-2"=>"1OxWXppSSUq1MFjQwvnFptuCM3gKOuKdlQQyVSEgvzzv4Aj+r2hSFM2UUw2NYyrR", "Content-Type"=>"application/xml", "Transfer-Encoding"=>"chunked", "Date"=>"Sun, 26 Feb 2012 10:00:47 GMT", "Connection"=>"close", "Server"=>"AmazonS3"}, @status=403> 

A potem mówi, że to jak również dla mojego śladu aplikacji:

app/controllers/users_controller.rb:39:in `update' 

I moja prośba parametrów:

{"utf8"=>"✓", 
"_method"=>"put", 
"authenticity_token"=>"DvADD1vYpCLcghq+EIOwVSjsfmAWCHhtA3VI5VGD/q8=", 
"user"=>{"avatar"=>#<ActionDispatch::Http::UploadedFile:0x007fc88cde76f8  
@original_filename="JeffPortraitMedium.png", 
@content_type="image/png", 
@headers="Content-Disposition: form-data; name=\"user[avatar]\"; 
filename=\"JeffPortraitMedium.png\"\r\nContent-Type: image/png\r\n", 
@tempfile=#<File:/var/folders/vg/98nv58ss4v7gcbf8px_8dyqc0000gq/T/RackMultipart20120226- 19096-1ppu2sr>>, 
"remote_avatar_url"=>"", 
"name"=>"Jeff Lam ", 
"email"=>"[email protected]", 
"user_bio"=>"Tester Hello", 
"shop"=>"1"}, 
"commit"=>"Update Changes", 
"id"=>"1"} 

Oto mój users_controller.rb kod częściowy:

def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
     redirect_back_or root_path 
     flash[:success] = "Your have updated your settings successfully." 
    else 
     flash.now[:error] = "Sorry! We are unable to update your settings. Please check your fields and try again." 
     render 'edit' 
    end 
end 

mój kod image_uploader.rb

# encoding: utf-8 
class ImageUploader < CarrierWave::Uploader::Base 

    # Include RMagick or MiniMagick support: 
    # include CarrierWave::RMagick 
    include CarrierWave::MiniMagick 

    # Choose what kind of storage to use for this uploader: 
    # storage :file 
    storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    # def default_url 
    # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 
    # end 

    # Process files as they are uploaded: 
    # process :scale => [200, 300] 
    # 
    # def scale(width, height) 
    # # do something 
    # end 

    # Create different versions of your uploaded files: 
    version :thumb do 
    process resize_to_fill: [360, 250] 
    end 

    version :cover_photo_thumb do 
    process resize_to_fill: [1170, 400] 
    end 

    version :event do 
    process resize_to_fill: [550, 382] 
    end 

    version :product do 
    process resize_to_fit: [226, 316] 
    end 

    # Add a white list of extensions which are allowed to be uploaded. 
    # For images you might use something like this: 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    # def filename 
    # "something.jpg" if original_filename 
    # end 

    # fix for Heroku, unfortunately, it disables caching, 
    # see: https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Make-Carrierwave-work-on-Heroku 
    def cache_dir 
    "#{Rails.root}/tmp/uploads" 
    end 

end 

Wreszcie mój plik fog.rb w config/inicjalizatory

CarrierWave.configure do |config| 
    config.fog_credentials = { 
    :provider    => 'AWS',  # required 
    :aws_access_key_id  => 'ACCESS_KEY',  # required 
    :aws_secret_access_key => 'SECRET_ACCESS_KEY/ZN5SkOUtOEHd61/Cglq9',  # required 
    :region     => 'Singapore' # optional, defaults to 'us-east-1' 
    } 
    config.fog_directory = 'ruuva/'      # required 
    config.fog_public  = false       # optional, defaults to true 
end 

Jestem w rzeczywistości dość zdezorientowany na niektóre rzeczy w mojej fog.rb . Po pierwsze, czy powinienem zmienić mój region na Singapur, jeśli stworzyłem wiadro o nazwie "ruuva", z regionem "Singapur" na moim koncie amazon s3?

Dziękuję wszystkim, którzy mogą pomóc z góry!

+3

czymkolwiek, jeśli otrzymasz 403, jest to błąd uwierzytelniania. Musisz najpierw zbadać w tym kierunku. – three

+0

spróbuj usunąć slash po 'ruuva', zmień także region na domyślny. –

Odpowiedz

8

Najpierw upewnij się, że używasz odpowiedniego poświadczenia przez nie ustawienie własnego regionu i niestandardowego katalogu (tworzenie fałszywego wiadro za darmo w domyślnym regionu)

Wtedy myślę, że nie używasz odpowiedniej nazwy dla tego regionu. Spróbuj ustawić swój region tak:

:region => 'ap-southeast-1' 
+2

Dziękujemy! Zrobiłem to, o co mnie poprosiłeś (sprawdź regiony, zrobiłem domyślne wiadro itp.) I jakoś zadziałało! Również w przypadku, gdy ktoś w jakiś sposób napotyka ten sam problem: należy ponownie uruchomić serwer aplikacji deweloperskiej za każdym razem, gdy zmieniłeś coś w fog.rb! Błąd nowicjusza, wiem. :) –

+0

S3 nie wymaga wyboru regionu. – Rubyrider

+0

Mogło się to zmienić, ale jakiś czas temu S3 miał standardowy punkt końcowy, który przekierował cię do właściwego regionu dla danego kubła. To nie było idealne, ponieważ każde żądanie zostało przekierowane – rpechayr

5

Byliśmy w obliczu tego samego problemu i stałe, że zmiana zgody autora związane z kluczem dostępu, zmieniając je na „User Power”. Sprawdź, czy potrzebujesz swojego użytkownika, aby był zaawansowanym użytkownikiem, zanim wprowadzisz go do produkcji.