裁剪图像后,S3不会存储所有图像尺寸

时间:2011-07-27 16:30:41

标签: ruby-on-rails-3 amazon-s3 paperclip jcrop

我使用paperclip + 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 Bucket中存储了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

1 个答案:

答案 0 :(得分:2)

这是它的工作原理:

  • 您将文件保存到amazon s3
  • 您通过CDN
  • 申请该文件
  • 如果文件可用,CDN会检查其缓存
  • 如果不可用,请从s3请求文件,缓存并提供
  • 如果可用,则从缓存中提供。此步骤可确保您的用户获得最佳体验。如果CDN每次从s3获取文件,那么它将比用户直接从s3获取文件花费的时间更长,这将无法实现CDN的目的。
  • 裁剪图像并将修改后的文件保存到s3
  • 您为文件请求CDN,期望它会为您提供裁剪文件
  • CDN检查其缓存中的文件,找到它并从缓存中提供文件。如果文件被修改,它不再询问s3

现在,我能想到的最佳方式是使用新文件名上传裁剪后的图像。因此,当CDN检查其缓存时,它不会在那里找到它并询问s3该文件。您可以使用delayed_job或resque删除后台中的旧文件。

希望,它澄清了事情。