0

ペーパークリップ+S3を使用して画像を保存します

has_attached_file :image,
                     :whiny => false,
                     :styles => { :large => "550x340>",
                                  :medium  => "165x165>",
                                  :small => "100x100>",
                                  :thumbnail => "55x55>"},
                     :processors => [:cropper],
                     :storage => :s3,
                     :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                     :path => "/:id/:style",
                     :bucket => "XXX" 

画像を使用してオブジェクトを作成すると、すべてがうまくいきます(S3バケットに保存されている4つの異なるサイズの画像の4つのコピー)

問題は、JCropを使用して画像をトリミングするときに発生します。S3は4つのコピーを保存しますが、トリミングされた画像と同じサイズで、実際には大きいサイズです。

私のcontroller.rb:

def update
@deal = Deal.find(params[:id])

respond_to do |format|
  if @deal.update_attributes(params[:deal])
    format.html { redirect_to(@deal, :notice => 'Deal was successfully updated.') }
    format.xml  { head :ok }
  else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @deal.errors, :status => :unprocessable_entity }
  end
end
4

1 に答える 1

2

仕組みは次のとおりです。

  • ファイルをAmazons3に保存します
  • CDNを介してファイルをリクエストします
  • CDNは、ファイルが利用可能かどうかキャッシュをチェックします
  • 利用できない場合は、s3からファイルをリクエストし、キャッシュして提供します
  • 利用可能な場合は、キャッシュから提供します。この手順により、ユーザーは最適なエクスペリエンスを得ることができます。CDNが毎回s3からファイルを取得する場合、ユーザーがs3から直接ファイルを取得するよりも時間がかかり、CDNの目的が損なわれます。
  • 画像を切り抜いて、変更したファイルをs3に保存します
  • トリミングされたファイルが提供されることを期待して、ファイルのCDNをリクエストします
  • CDNは、ファイルのキャッシュをチェックし、それを見つけて、キャッシュからファイルを提供します。ファイルが変更されたかどうかをs3に再度要求することはありません

さて、私が考えることができる最も最適な方法は、新しいファイル名でトリミングされた画像をアップロードすることです。そのため、CDNはキャッシュをチェックするときに、キャッシュを見つけられず、s3にファイルを要求します。delayd_jobまたはresqueを使用して、バックグラウンドで古いファイルを削除できます。

うまくいけば、それは物事を明確にします。

于 2011-07-28T11:15:55.453 に答える