tutorial multiple files aws ruby-on-rails ruby-on-rails-4 amazon-s3 carrierwave fog

ruby on rails - multiple - Exconn:: Errors:: SocketError en la carga de archivos a través de Carrierwave y niebla



fog gem (2)

Esto es una continuación del problema que tuve recientemente: error de nivel de pila demasiado profundo, producido con parámetros fuertes, creo

Cada vez que hago una creación de Post , que implica una carga de archivo, obtengo este error:

Started POST "/posts" for 127.0.0.1 at 2014-08-28 08:47:09 -0500 Processing by PostsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"daUAMfiQZ/uiD/0ADg=", "post"=>{"status"=>"confirmed", "title"=>"Ashlee lost 10 pounds in 5 weeks", "photo"=>#<ActionDispatch::Http::UploadedFile:0x000001038f04b8 @tempfile=#<Tempfile:/var/folders/0f/hgplttnd7dg6q9m62qtbnpn00000gn/T/RackMultipart20140828-89271-qwxck1>, @original_filename="Ashlee-Testimonial.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=/"post[photo]/"; filename=/"Ashlee-Testimonial.png/"/r/nContent-Type: image/png/r/n">, "body"=>"She lost 10 pounds in 5 weeks doing 10PP."}, "commit"=>"Submit"} User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 (0.4ms) SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = ''admin'') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 1]] (0.2ms) BEGIN SQL (2.2ms) INSERT INTO "posts" ("body", "created_at", "photo", "status", "title", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["body", "She lost 10 pounds in 5 weeks doing 10PP."], ["created_at", "2014-08-28 13:47:09.320765"], ["photo", "Ashlee-Testimonial.png"], ["status", "confirmed"], ["title", "Ashlee lost 10 pounds in 5 weeks"], ["updated_at", "2014-08-28 13:47:09.320765"], ["user_id", 1]] Digest::Digest is deprecated; use Digest (0.3ms) ROLLBACK Completed 500 Internal Server Error in 10904ms Excon::Errors::SocketError - Broken pipe:

Mi modelo de Post ve así:

# == Schema Information # # Table name: posts # # id :integer not null, primary key # status :string(255) # title :string(255) # date :datetime # photo :string(255) # body :text # created_at :datetime # updated_at :datetime # user_id :integer # ancestry :string(255) # file :string(255) # class Post < ActiveRecord::Base has_ancestry belongs_to :user resourcify mount_uploader :photo, ImageUploader mount_uploader :file, FileUploader end

Mi controlador se ve así:

def create @post = current_user.posts.new(post_params) respond_to do |format| if @post.save format.html { redirect_to @post, notice: ''Post was successfully created.'' } format.json { render :show, status: :created, location: @post } else format.html { render :new } format.json { render json: @post.errors, status: :unprocessable_entity } end end end private # Never trust parameters from the scary internet, only allow the white list through. def post_params params.require(:post).permit(:status, :title, :date, :photo, :body, :parent_id) end

Este es mi image_uploader.rb :

# encoding: utf-8 class ImageUploader < CarrierWave::Uploader::Base include CarrierWave::RMagick storage :fog include CarrierWave::MimeTypes process :set_content_type def store_dir "images/#{model.id}-#{model.created_at}" end version :thumb do process :resize_to_fit => [80, 80] end version :large do process :resize_to_limit => [400, 400] end def extension_white_list %w(jpg jpeg gif png) end end

Este es mi Gemfile:

source ''https://rubygems.org'' gem ''rails'', ''4.1.1'' group :assets do gem ''sass-rails'', ''~> 4.0.3'' gem ''uglifier'', ''>= 1.3.0'' gem ''coffee-rails'', ''~> 4.0.0'' gem "font-awesome-rails" gem ''bootstrap-sass'', ''~> 3.2.0'' gem ''autoprefixer-rails'' end group :development do gem ''annotate'', github: ''ctran/annotate_models'' gem ''sextant'' gem "quiet_assets", ">= 1.0.2" gem ''better_errors'', ''~> 1.1.0'' gem ''binding_of_caller'', ''~> 0.7.2'' gem ''meta_request'' gem ''execjs'' gem ''therubyracer'' gem "letter_opener" gem ''bullet'' gem ''rack-mini-profiler'' gem ''guard-rails'' gem ''rb-fchange'', :require=>false gem ''rb-fsevent'', :require=>false gem ''rb-inotify'', :require=>false gem ''guard-livereload'', ''~> 2.3.0'', :require=>false gem ''rack-livereload'', ''~> 0.3.15'' end group :production do gem ''rails_12factor'' end gem ''jquery-rails'' gem ''turbolinks'' gem ''jbuilder'', ''~> 2.0'' gem ''sdoc'', ''~> 0.4.0'', group: :doc gem ''spring'', group: :development gem ''devise'', ''~> 3.2.4'' gem ''thin'' gem ''pg'' gem ''cancancan'', ''~> 1.8.2'' gem ''rolify'' gem ''rmagick'', :require => ''RMagick'' gem "mini_magick" gem ''carrierwave'', ''~> 0.10.0'' gem "fog", "~> 1.3.1" gem ''figaro'', ''~> 0.7.0'' gem ''geocoder'', ''~> 1.2.2'' gem ''social-share-button'', ''~> 0.1.6'' gem ''ancestry'', ''~> 2.1.0'' gem "simple_form"

Este es mi formulario de carga parcial:

<%= simple_form_for @post do |f| %> <%= f.error_notification %> <%= f.input :parent_id, as: :hidden %> <% if can? :manage, @post %> <%= f.input :status, collection: Status.all %> <% end %> <%= f.input :title %><br /> <%= f.input :date %><br /> <%= f.input :photo %><br /> <%= f.input :body %><br /> <%= f.button :submit %> <% end %>

Este es mi archivo config/carrierwave.rb :

CarrierWave.configure do |config| config.fog_credentials = { provider: ''AWS'', region: ''us-east-1'', aws_access_key_id: ENV["AWS_ACCESS_KEY"], aws_secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"], } config.fog_directory = ENV["AWS_MY_BUCKET"] end

¿Alguna idea de lo que puede estar causando esto?

Actualización 1

Aquí hay más información de depuración. Una vez que elimine el cambio de tamaño de las imágenes, ese mensaje de error de socket desaparece.

Pero este es el nuevo error que obtengo:

Digest::Digest is deprecated; use Digest (0.2ms) ROLLBACK Completed 500 Internal Server Error in 7372ms Excon::Errors::Forbidden - Expected(200) <=> Actual(403 Forbidden) request => {:connect_timeout=>60, :headers=>{"Content-Length"=>225260, "Content-Type"=>"image/png", "x-amz-acl"=>"public-read", "Date"=>"Thu, 28 Aug 2014 16:34:11 +0000", "Authorization"=>"AWS PUBLIC_KEY:SECRET_KEY=", "Host"=>"my_site.s3.amazonaws.com:443"}, :instrumentor_name=>"excon", :mock=>false, :read_timeout=>60, :retry_limit=>4, :ssl_ca_file=>"/.rvm/gems/ruby-2.1.1@my_site/gems/excon-0.13.4/data/cacert.pem", :ssl_verify_peer=>true, :write_timeout=>60, :host=>"my_site.s3.amazonaws.com", :path=>"/images%2F7-2014-08-28+16%3A34%3A11+UTC%2F10pp-main-banner.png", :port=>"443", :query=>nil, :scheme=>"https", :body=>#<File:/myapp/public/uploads/tmp/1409243651-91536-3147/10pp-main-banner.png>, :expects=>200, :idempotent=>true, :method=>"PUT"} response => #<Excon::Response:0x000001035f0f88 @body="<?xml version=/"1.0/" encoding=/"UTF-8/"?>/n<Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message><RequestId>2FDE1E67B32981B7</RequestId><HostId>itxnvlzNTkJ29N3MtyYmL8EP29zrW6s9Hr6Xc2P7QzTElkB56OU26WdzsE/6vSz1</HostId><AWSAccessKeyId>AKIAISIFEOAKO3CNPZTA</AWSAccessKeyId></Error>", @headers={"x-amz-request-id"=>"2FDE1E67B32981B7", "x-amz-id-2"=>"itxnvlzNTkJ29N3MtyYmL8EP29zrW6s9Hr6Xc2P7QzTElkB56OU26WdzsE/6vSz1", "Content-Type"=>"application/xml", "Transfer-Encoding"=>"chunked", "Date"=>"Thu, 28 Aug 2014 16:34:16 GMT", "Connection"=>"close", "Server"=>"AmazonS3"}, @status=403>:


Creo que podría tener que ver con la configuración regional después de todo.

Aquí hay un ejemplo de alguien que usa s3, pero es la misma idea. ellos dicen lo siguiente:

Hace poco estuve trabajando en mi sitio web y tuve un problema al subir archivos más grandes (como 1.8M) a S3 a través de Carrierwave / Fog. Obtuve el siguiente error: Excon :: Errors :: SocketError (Broken pipe (Errno :: EPIPE)):

Lo que descubrí fue que el código de región debía establecerse en mi archivo de inicialización carrierwave.rb para poder cargar los archivos más grandes. Aparentemente está predeterminado a algún código de región que no sea el que yo estaba usando y que, por algún motivo, genera un error al cargar archivos más grandes.

Para encontrar el código de región, navegue a través de S3 a un archivo real que haya sido almacenado y haga clic en él y haga clic en "Propiedades" en la esquina superior derecha de la pantalla. Verás algo así como el siguiente enlace:

https://s3-us-west-2.amazonaws.com/ginger2/uploads/web_developer_project_image/image/1/thumb_Screen_Shot_2013-09-05_at_2.10.45_PM.png

En este caso, el siguiente es el código de región que debe establecer en su configuración: us-west-2


Me lo imaginé. Lo que sucedió fue que creé un nuevo usuario en AWS IAM para esta aplicación, y no le di esas credenciales apropiadas al usuario. es decir, nunca creé una política de seguridad ni los asigné a un grupo. Entonces estaba generando un error 403.

Ahora que lo arreglé, todo funciona sin problemas.

Espero que esto ayude a alguien más.