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 Bucket 中存储了 4 个不同大小的图像的 4 个副本)

当我使用 JCrop 裁剪图像时出现问题,S3 存储 4 个副本,但裁剪图像的大小相同,实际上是大尺寸。

我的控制器.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

这是它的工作原理:

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

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

希望,它澄清了事情。

于 2011-07-28T11:15:55.453 回答