2012-02-03 11 views
5

私は自分のアプリケーションのS3に直接ファイルアップロードを開発しようとしています。私はgithubのチュートリアルに従っていますが、すべてが多かれ少なかれokですが、後処理をしようとするとエラーメッセージが表示されます。save_and_process後処理403 Forbidden Carrierwave_direct S3 Fog

私は次のようでした。その後、私はアップローダーを持って

class Clip < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 
    mount_uploader :avatar, AvatarUploader 

    attr_accessible :id, :avatar, :name, :clipat_file_name, :attachable_id, :attachable_type, :clipat, :project_id, :user_id, :path, :parent_id, 

    def save_and_process_avatar(options = {}) 
    if options[:now] or 1==1 
     self.remote_avatar_url = avatar.direct_fog_url(:with_path => true) 
     save 
    else 
     Resque.enqueue(AvatarProcessor, attributes) 
    end 
    end 

class AvatarUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 
    include CarrierWaveDirect::Uploader 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}" #I removed /#{model.id} from the template because it creates an empty directory on the server. But If I put it back, the same problem remains 
    end 
    version :thumb do 
    process :resize_to_limit => [50, 50] 
    end 
end 

とアバターコントローラavatar_uploader.rb

を私はclip.rbと呼ばれるActiveRecordのモデルを持っています:

class AvatarsController < ApplicationController 
    def new 
    @uploader = Clip.new.avatar 
    @uploader.success_action_redirect = 'http://localhost:3000/clips' 
    end 
end 

そして最後に私のclip_controller:私は、ファイルをアップロードすると、私はちょうど私の「クリップ」を保存した場合

class ClipsController < ApplicationController 
    def index 
    if params[:key] 
     key=params[:key].split("/") 
     clip = Clip.new 
     clip.attachable_id = key[3] 
     clip.attachable_type = "Pmdocument" 
     clip.key = params[:key] 
#  clip.save 
     clip.save_and_process_avatar 
    end 
    @clips = Clip.where("avatar is not null") 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @clips.collect { |p| p.to_jq_upload }.to_json } 
    end 
    end 

は、すべてがOKです。私はしかし、save_and_processメソッドを使用している場合は、エラーが行で発生する: self.remote_avatar_url = avatar.direct_fog_url(:with_path =>真)

をこれはエラーメッセージです:

OpenURI::HTTPError (403 Forbidden): 
    app/models/clip.rb:38:in `save_and_process_avatar' 
    app/controllers/clips_controller.rb:22:in `index' 

Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms) 
Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.2ms) 
Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (5.2ms) 

私がしてきましたこれに2日掛かりますので、どんな助けでも大歓迎です!!!ありがとう!!!ニコラス。

+0

この行の結果はどうなっていますか? 'self.remote_avatar_url = avatar.direct_fog_url(:with_path => true)' – pschuegr

+0

私はCarrierwaveで長年働いていません(Paperclipに戻る)。だから私はあなたの質問に答えることはできません。ごめんなさい... – ndemoreau

答えて

2

self.remote_avatar_urlに提供されたURLが間違っています。私はこの同じ問題を抱えていました。CWDirect gemが提供するコードは私のためにはうまくいかず、誤ったURLを与えてしまったので、CarrierWaveは画像をダウンロードして処理できませんでした。 403 Forbiddenのエラーメッセージ全体は、Amazonのクラップメッセージでした。これはPermissionsに何か問題があると信じています。私の場合、パーミッションには何も間違っていませんでした。そこにはイメージがないということだけでした。

def save_and_process_image(options = {}) 
if options[:now] 
    # debugger 
    self.remote_image_url = image.direct_fog_url+self.key # OLD CODE THAT AINT WORKIN! --> image.direct_fog_url(:with_path => true) 
    save 
else 
    # Resque.enqueue(AvatarProcessor, attributes) 
    # TODO: Implement background processing 
end 
end 

注私取り付けられたフィールドの名前がimageないavatarであること:ここでは、これは私のために働いてしまったコードが、私はURLがどのように形成されるか変更しまし気づかされます。デバッグモードの種類irbで起動しながら、ちょうどself.remote_image_url行の前にプログラムを凍結する(真上デバッガの行のコメントを外し)レールデバッガを使用し、これを試してみる - 私はこの時点になって、それを固定する方法

コンソールを起動します。それから、あなたがプリントアウトし、本当に 'image.direct_fog_url(:with_path => true)'という値があなたに与えているのを実際に見ることができます。これをコピーしてブラウザに貼り付けることができます。それが間違っている(おそらく)場合は、権限の問題ではないにもかかわらず、愚かなアクセス許可のエラーが表示されますが、正しい場合はアップロードされたイメージが表示されるか、イメージがダウンロードされます。

アップロードしたばかりのイメージを見つけるために、Amazon S3コンソールを開いてdevバケットを表示することをお勧めします。コンソールで画像を見つけ、そのプロパティに移動して、あなたがと思われるWebアドレス/ URLを表示することができます。が使用されています。

これが役に立ちます。誤解を招くエラーのため、これは私のために追跡するのが難しいので、私はS3バケットの権限を修正しようと多くの時間を費やしましたが、これは問題ではなく、CWDirectのgithubページのコードは私のためには機能しません(宝石バージョン??)。

関連する問題