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.