remove rails mount_uploader ruby-on-rails heroku amazon-s3 carrierwave fog

ruby on rails - rails - Carrierwave cargando con s3 y niebla



remove image carrierwave (2)

estado tratando de buscar el motivo de este error durante mucho tiempo y parece que no puede encontrar ningún ...

Así que tengo una aplicación de rieles, y utilizo carrierwave para subir fotos. También quiero utilizar Amazon S3 para el almacenamiento de carga de archivos en mi aplicación.

Inicialmente, mientras desarrollo la aplicación, permití que las cargas de archivos estuvieran en el archivo on: file, es decir,

image_uploader.rb

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

Ahora, al finalizar el desarrollo y ponerlo en funcionamiento (uso heroku), decidí cambiar el almacenamiento de la onda de transporte a S3 para probarlo localmente.

image_uploader.rb

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

Sin embargo, ahora cuando intento subir una imagen (ya sea para avatar de usuario, etc.) aparece este error:

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 ... 1@/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>

Y luego dice esto también para mi rastro de aplicación:

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

Y mis parámetros de SOLICITUD:

{"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"}

Aquí está mi código parcial users_controller.rb:

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

Mi código 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

Finalmente, mi archivo fog.rb en config / initializers

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

En realidad estoy bastante confundido sobre algunas de las cosas en mi fog.rb. En primer lugar, ¿debería cambiar mi región a Singapur si crease un cubo llamado "ruuva", con la región "Singapur" en mi cuenta amazon s3?

¡Gracias a todos los que pueden ayudar de antemano!


Primero asegúrese de usar las credenciales correctas al no configurar una región personalizada y un directorio personalizado (cree un cubo falso de forma gratuita en la región predeterminada)

Entonces creo que no estás usando el nombre correcto para la región. Intenta configurar tu región de esta manera:

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


Estábamos enfrentando el mismo problema y solucionamos el cambio del permiso del usuario asociado a su clave de acceso, cambiándolo a "Usuario avanzado". Compruebe si necesita que su usuario sea un usuario avanzado antes de ponerlo en producciones.