Exconn :: Errors ::通过Carrierwave和Fog上传文件中的SocketError

这是我最近遇到的问题的延续 – Stack Level Too Deep错误 – 我认为它具有强大的参数

每当我做一个涉及文件上传的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=#, @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  [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" 

这是我的上传表单部分:

       



这是我的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=>#, :expects=>200, :idempotent=>true, :method=>"PUT"} response => #<Excon::Response:0x000001035f0f88 @body="\nInvalidAccessKeyIdThe AWS Access Key Id you provided does not exist in our records.2FDE1E67B32981B7itxnvlzNTkJ29N3MtyYmL8EP29zrW6s9Hr6Xc2P7QzTElkB56OU26WdzsE/6vSz1AKIAISIFEOAKO3CNPZTA", @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>: 

我认为它可能与语言环境有关。

这是一个使用s3的人的例子,但它的想法是一样的。 他们说以下内容:

我最近在我的网站上工作并遇到了通过Carrierwave / Fog将更大的文件(如1.8M)上传到S3的问题。 我收到以下错误:Excon :: Errors :: SocketError(Broken pipe(Errno :: EPIPE)):

我发现需要在我的carrierwave.rb初始化文件中设置区域代码才能上传更大的文件。 显然它默认为某个区域代码而不是我使用的区域代码,并且由于某种原因导致上传较大文件时出错。

要查找区域代码,请在S3中导航到已存储的实际文件,然后单击它并单击屏幕右上角的“属性”。 您将看到类似以下内容的链接:

http://sofzh.miximages.com/ruby-on-rails/thumb_Screen_Shot_2013-09-05_at_2.10.45_PM.png

在这种情况下,以下是您应在配置中设置的区域代码:us-west-2

我想到了。 发生的事情是我在AWS IAM中为此应用程序创建了一个新用户,但我没有给该用户提供正确的凭据。 即我从未创建过安全策略或将其分配给组。 所以它产生了403错误。

现在我已经解决了这个问题,一切顺利。

我希望这有助于其他人。

Interesting Posts