2011-07-27 15 views
0

使用回形針+ S3,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" 

存儲I圖像時創建與圖像的每一件事情變爲所述圖像的精細(4份4種不同尺寸的對象存儲在我的S3桶中)

問題出在我用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 
+0

你使用CDN來提供文件嗎?如果是,則圖像緩存在邊緣位置。一種方法可能是要求CDN從緩存中逐出圖像,但這會花錢,因此請使用新名稱保存裁剪後的文件。 – rubish

+0

我不明白爲什麼緩存會造成我的問題? – Aboelnour

回答

2

這是它如何工作的:

  • 您將文件保存到Amazon S3
  • 您請求的文件雖然CDN
  • CDN檢查它的緩存文件是否可用
  • 如果不可用,請求s3中的文件,緩存它並提供服務
  • 如果可用,則從緩存中提供服務。這一步確保您的用戶獲得最佳體驗。如果CDN每次從s3獲取文件,則比用戶直接從s3獲取文件需要更長的時間,這將會破壞CDN的目的。
  • 您剪裁圖像並保存修改後的文件到S3
  • 您要求CDN文件想到它會給你裁剪文件
  • CDN檢查其高速緩存的文件,發現它並提供從緩存中的文件。它不再詢問s3文件是否被修改

現在,我能想到的最佳方式是用新文件名上傳裁剪後的圖像。因此,當CDN檢查它的緩存時,它不會在那裏找到它並要求s3提供該文件。您可以使用delayed_job或resque在後臺刪除舊文件。

希望它澄清事情。

+0

很好的解釋謝謝。 但讓我澄清我的問題:我有4個相同大小的版本**裁剪圖像**不是原來的。 在這種情況下緩存仍然是問題? – Aboelnour

+0

如果我理解它是正確的,如果直接將圖像保存到對象中一切都很好,但是如果在保存之前使用jcrop裁剪圖像,則會在**新對象**中獲取所有相同大小的樣式?是嗎?如果是的話,可能緩存不在這裏,我不知道什麼是錯的。 – rubish

+0

nop 我已經有一個對象,當我用裁剪後的圖像進行更新時,我有一個尺寸不是4尺寸的裁剪圖像。 – Aboelnour