Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 裁剪图像后,S3不会';t存储所有图像大小_Ruby On Rails 3_Amazon S3_Paperclip_Jcrop - Fatal编程技术网

Ruby on rails 3 裁剪图像后,S3不会';t存储所有图像大小

Ruby on rails 3 裁剪图像后,S3不会';t存储所有图像大小,ruby-on-rails-3,amazon-s3,paperclip,jcrop,Ruby On Rails 3,Amazon S3,Paperclip,Jcrop,I使用回形针+S3存储图像 has_attached_file :image, :whiny => false, :styles => { :large => "550x340>", :medium => "165x165>", :small

I使用回形针+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个不同大小的图像副本)

当我使用JCrop裁剪图像时,问题出现了,S3存储了4个拷贝,但是对于裁剪后的图像,大小相同,实际上是大尺寸

My 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
这就是它的工作原理:

  • 将文件保存到AmazonS3
  • 您可以通过CDN请求该文件
  • CDN检查其缓存文件是否可用
  • 如果不可用,从s3请求文件,缓存它并提供服务
  • 如果可用,从缓存中提供服务。此步骤可确保用户获得最佳体验。如果CDN每次都从s3获取文件,那么它将比用户直接从s3获取文件花费更长的时间,这将破坏CDN的用途
  • 裁剪图像并将修改后的文件保存到s3
  • 您为文件请求CDN,希望它将为您提供裁剪过的文件
  • CDN检查其缓存中的文件,找到它并从缓存中提供文件。它不会再次询问s3文件是否被修改
现在,我能想到的最理想的方法是用一个新的文件名上传裁剪过的图像。因此,当CDN检查其缓存时,它没有在那里找到它,并向s3请求该文件。您可以使用延迟作业或重新创建在后台删除旧文件


希望,它澄清了问题。

您是否使用CDN来提供文件?如果是,则图像缓存在边缘位置。一种方法是要求CDN从缓存中删除图像,但这需要花费金钱,因此请使用新名称保存剪切的文件。我不明白为什么缓存会造成我的问题?很好的解释,谢谢。但让我澄清一下我的问题:我得到了4个相同大小的版本,用于裁剪图像,而不是原始图像。在这种情况下,缓存仍然是个问题吗?如果我理解正确,如果您直接将图像保存到对象,一切都会很好,但是如果您在保存之前使用jcrop裁剪图像,在新对象中,您会得到大小相同的所有样式吗?是这样吗?如果是的话,很可能缓存在这里不起作用,我不知道出了什么问题。不,我已经有了一个对象,当我用裁剪图像更新它时,我有一个裁剪图像,大小为一个而不是4个。这也没有意义,你是否尝试过在新对象中上载裁剪图像,而不是更新现有对象。没有用过回形针,我用的是卡里尔波。如果是CW,我建议将调试代码放在回调中以找到问题的根源。