Exconn::Errors::SocketError при загрузке файла через Carrierwave и Fog

Это продолжение проблемы, с которой я недавно столкнулся - Ошибка слишком глубокого уровня стека - я думаю, что она создается с сильными параметрами

Всякий раз, когда я делаю создание Post, которое включает загрузку файла, я получаю эту ошибку:

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:

Моя модель Post выглядит так:

# == 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

Мой контроллер выглядит так:

  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

Это мой 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

Это мой 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"

Это частично моя форма загрузки:

<%= 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 %>

Это мой 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

Любые идеи, что может быть причиной этого?

Обновление 1

Вот еще немного информации об отладке. Как только я удаляю изменение размера изображений, это сообщение об ошибке сокета исчезает.

Но это новая ошибка, которую я получаю:

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

person marcamillion    schedule 28.08.2014    source источник
comment
Может быть, это? stackoverflow.com/a/18754787/2128691   -  person dax    schedule 28.08.2014
comment
@dax Я пробовал это ... поэтому us-east-1 указано в моем файле Carrierwave.rb. Кроме того....us-east-1 является стандартом США... насколько мне известно. Короче говоря... да... я уже это делаю.   -  person marcamillion    schedule 28.08.2014
comment
а, ладно, извините, не видел.   -  person dax    schedule 28.08.2014


Ответы (2)


Я думаю, что это может быть связано с локалью в конце концов.

Вот пример того, кто использует s3, но это та же идея. они говорят последующий:

Недавно я работал над своим веб-сайтом и столкнулся с проблемой загрузки больших файлов (например, 1,8 МБ) на S3 через Carrierwave/Fog. Я получал следующую ошибку: Excon::Errors::SocketError (Broken pipe (Errno::EPIPE)):

Я обнаружил, что код региона необходимо установить в моем файле инициализации несущей волны.rb, чтобы загружать большие файлы. По-видимому, по умолчанию используется какой-то код региона, отличный от того, который я использовал, и это по какой-то причине приводит к ошибке при загрузке больших файлов.

Чтобы найти код региона, перейдите через S3 к реальному файлу, который был сохранен, нажмите на него и нажмите «Свойства» в правом верхнем углу экрана. В качестве ссылки вы увидите что-то вроде следующего:

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

В этом случае следующий код региона, который вы должны установить в своей конфигурации: us-west-2

person dax    schedule 28.08.2014
comment
Я склонен согласиться с вами. Проблема в том, что я не могу понять, я пробовал us-west-2, но это не работает. Когда я вхожу в свою учетную запись AWS и проверяю корзину, я вижу Endpoint: my_site.s3-website-us-east-1.amazonaws.com, что у меня изначально было, и выдает ту же ошибку. - person marcamillion; 28.08.2014
comment
Спасибо за помощь. Я понял. Произошло следующее: я создал нового пользователя в AWS IAM для этого приложения и не предоставил этому пользователю надлежащие учетные данные. т.е. я никогда не создавал политику безопасности и не назначал их группе. Поэтому выдавал ошибку 403. Теперь, когда я это исправил, все работает гладко. Если вы добавите это как ответ или измените свой, я приму это. Спасибо за все мэн! - person marcamillion; 29.08.2014

Я понял. Произошло следующее: я создал нового пользователя в AWS IAM для этого приложения и не предоставил этому пользователю надлежащие учетные данные. т.е. я никогда не создавал политику безопасности и не назначал их группе. Поэтому выдавал ошибку 403.

Теперь, когда я это исправил, все работает гладко.

Я надеюсь, что это поможет кому-то другому.

person marcamillion    schedule 30.08.2014