5

アプリの S3 への直接フ​​ァイルアップロードを開発しようとしています。私はこれについて github チュートリアルに従っていますが、すべては多かれ少なかれ問題ありませんが、後処理を行おうとするとエラー メッセージが表示されます。

私は次のことをしました:

私はclip.rbと呼ばれるアクティブレコードモデルを持っています:

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

次に、アップローダーがあります: avatar_uploader.rb

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

そしてアバターコントローラー:

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

ファイルをアップロードするときに、「クリップ」を保存するだけで問題ありません。ただし、save_and_process メソッドを使用すると、次の行でエラーが発生します: self.remote_avatar_url = avatar.direct_fog_url(:with_path => true)

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

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日間ぶら下がっているので、どんな助けでも大歓迎です!!! ありがとう!!!ニコラス。

4

1 に答える 1

2

私の賭けは、提供されたURLself.remote_avatar_urlが正しくないということです。これと同じ問題が発生し、CWDirect gemが提供するコードが機能せず、間違ったURLが表示されたため、CarrierWaveは画像をダウンロードして処理できませんでした。403 Forbiddenエラーメッセージ全体はAmazonからのくだらないメッセージでした。これにより、パーミッションに何か問題があると思われるようになります。私の場合、権限にはまったく問題はありませんでした。そこにイメージがなかっただけです。これが私のためにこれを機能させたコードです、URLが形成される方法を変更したことに注意してください:

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

この点に到達して修正した方法-これを試して、railsデバッガー(上記のデバッガー行のコメントを外す)を使用して行の直前でプログラムをフリーズしself.remote_image_url、デバッグモードタイプirbでコンソールを起動します。次に、印刷して、「image.direct_fog_url(:with_path => true)」が実際にどのような値を与えているかを確認できます。これをコピーしてブラウザに貼り付けることができます。それが間違っている場合(おそらくそうです)、(アクセス許可の問題ではありませんが)ばかげたアクセス許可エラーが発生しますが、正しい場合は、アップロードされた画像が表示されるか、画像がダウンロードされます。

アップロードしたばかりの画像を見つけることができるように、AmazonS3コンソールを開いて開発バケットを表示することをお勧めします。コンソールで画像を見つけてそのプロパティに移動すると、使用するはずのWebアドレス/URLが表示されます。

お役に立てれば。誤解を招くエラーのため、これを追跡するのは困難でした。S3バケットのアクセス許可を修正するために多くの時間を費やしましたが、これは問題ではありませんでした。CWDirectgithubページのコードだけでは機能しません。 (gemバージョン??)。

于 2013-02-09T19:51:51.303 に答える