Carrierwave hochladen mit s3 und Nebel

schon versucht zu suchen, der Grund für diesen Fehler für eine lange Zeit und kann nicht scheinen zu finden...

Also ich habe eine rails-app, und ich nutzen, carrierwave für Bilder hochladen. Ich möchte auch die Nutzung von Amazon S3 für die Datei-upload-Speicher in meinem app.

Zunächst, wie ich bin Entwicklung der app habe ich erlaubt Datei-uploads werden auf die auf :Datei, d.h.

image_uploader.rb

# Choose what kind of storage to use for this uploader:
  storage :file
# storage :fog

Nun nach der Fertigstellung die Entwicklung und stellen Sie es live (ich benutze heroku), habe ich beschlossen, die änderung der carrierwave Speicherung auf S3, um es zu testen vor Ort.

image_uploader.rb

# Choose what kind of storage to use for this uploader:
# storage :file
storage :fog

Allerdings, wenn ich jetzt versuche ein Bild hochzuladen (sei es für den user-avatar, etc) bekomme ich diesen Fehler:

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>

Und dann heißt es dies auch für meine Anwendung-trace:

app/controllers/users_controller.rb:39:in `update'

Und meine ANFRAGE Parameter:

{"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"}

Hier mein users_controller.rb teilweise code:

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

Meine image_uploader.rb code

# 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

Schließlich, meine Nebel.rb-Datei in der config/Initialisierungen

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

Ich bin eigentlich Recht verwirrt über einige der Dinge, die in meinem Nebel.rb. Erstens, sollte ich meine region nach Singapur, wenn ich ein Eimer als "ruuva", mit der region, die "Singapur" auf meinem amazon s3 account?

Danke an alle, die helfen können im Voraus!

  • was auch immer es ist, wenn Sie erhalten eine 403-es ist ein Authentifizierungsfehler. Sie müssen zu untersuchen, die in diese Richtung erste.
  • versuchen Sie, entfernen Sie den Schrägstrich nach ruuva, auch die region ändern um die Standard-Einstellung.
Schreibe einen Kommentar