jqueryruby-on-railsamazon-web-servicesamazon-s3carrierwave

Rails Carrier Wave and JQuery Uploader to Amazon S3


I am trying to implement the multiple uploading to Amazon S3 https://github.com/jnicklas/carrierwave/blob/master/README.md (under Using Amazon S3)

But I got an error inside the log file:

Started POST "/images?project_id=18" for 124.106.90.29 at Wed Dec 14 19:11:47 -0600 2011
  Processing by ImagesController#create as JS
  Parameters: {"project_id"=>"18", "authenticity_token"=>"9z0CzTtMwxgfdsyFLCNzx44qqRDT8F7+6F/RsVzUe4=", "utf8"=>"✓", "image"=>{"carimage"=>#<ActionDispatch::Http::UploadedFile:0x6eab8de86708 @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"image[carimage]\"; filename=\"stroke_holding.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20111214-5354-1b4qtl7-0>, @original_filename="stroke_holding.jpg">, "project_id"=>"18"}}
  [1m[35mProject Load (0.2ms)[0m  SELECT `projects`.* FROM `projects` WHERE `projects`.`id` = 18 LIMIT 1
  [1m[36m (0.1ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (1.2ms)[0m  INSERT INTO `images` (`caption`, `carimage`, `created_at`, `proj_photo_content_type`, `proj_photo_file_name`, `proj_photo_file_size`, `proj_photo_updated_at`, `project_id`, `updated_at`) VALUES (NULL, 'stroke_holding.jpg', '2011-12-15 01:11:48', NULL, NULL, NULL, NULL, 18, '2011-12-15 01:11:48')
  [1m[36m (1.7ms)[0m  [1mROLLBACK[0m
Completed 500 Internal Server Error in 2635ms

Excon::Errors::MovedPermanently (Expected(200) <=> Actual(301 Moved Permanently)
  request => {:port=>"443", :method=>"PUT", :idempotent=>true, :body=>#<File:/home/ngtv2/activedesigns/public/uploads/tmp/20111214-1911-5354-1557/stroke_holding.jpg>, :headers=>{"Authorization"=>"AWS XXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXX/XXXXXXXXXXXXXXXXXXX=", "x-amz-acl"=>"public-read", "Date"=>"Thu, 15 Dec 2011 01:11:48 +0000", "Content-Type"=>"image/jpeg", "Content-Length"=>64387, "Host"=>"sample.s3-eu-west-1.amazonaws.com:443"}, :host=>"sample.s3-eu-west-1.amazonaws.com", :query=>nil, :connect_timeout=>60, :expects=>200, :read_timeout=>60, :scheme=>"https", :write_timeout=>60, :path=>"/stroke_holding.jpg", :mock=>nil}
  response => #<Excon::Response:0x6eab8c663f18 @body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message><RequestId>2990AE131EF6DCE2</RequestId><Bucket>sample</Bucket><HostId>q+XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId><Endpoint>s3.amazonaws.com</Endpoint></Error>", @status=301, @headers={"x-amz-id-2"=>"q+XXXXXXXXXXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXX", "Transfer-Encoding"=>"chunked", "Date"=>"Thu, 15 Dec 2011 01:11:49 GMT", "Content-Type"=>"application/xml", "x-amz-request-id"=>"2990AE131EF6DCE2", "Server"=>"AmazonS3", "Connection"=>"close"}>):
  app/controllers/images_controller.rb:37:in `create'

Rendered vendor/bundle/ruby/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms)
Rendered vendor/bundle/ruby/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
Rendered vendor/bundle/ruby/1.8/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (4.4ms)

Here is my line 37 in images controller:

def create
  @image = Image.new(params[:image])
  if @image.save <--------line 37
    render :json => [@image.to_jq_upload].to_json
  end
end

I also get something like this in error console:

Error: not well-formed Source File: https://s3-console-us-standard.console.aws.amazon.com/DeliverHttp Line: 1, Column: 1 Source Code: {

enter image description here

config/initializers/currierwave.rb

CarrierWave.configure do |config|
    config.fog_credentials = {
        :provider               => 'AWS', 
        :aws_access_key_id      => 'XXXXXXXXXXXXXXXXXXX', 
        :aws_secret_access_key  => 'XXXXXXXXXXXXXXXXXXX', 
        :region                 => 'eu-west-1'  
    }
    config.fog_directory  = 'sample'
    config.s3_bucket = "XXXXXXXXXX"
end 

enter image description here


Solution

  • The config.fog_directory should be set to the name of the directory on S3 (which I presume is not actually sample). The error you are getting is because you are using the 'eu-west-1' endpoint to try and access a bucket that is in the standard endpoint. So you should either change buckets or change regions, so that both will match.