после обрезки изображения S3 не сохраняет все размеры изображения - PullRequest
0 голосов
/ 27 июля 2011

Я сохраняю изображения, используя скрепку + 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" 

, когда я создаю объект с изображением, все идет хорошо (4 копии изображения с 4 различными размерами, хранящиеся в моем S3 Bucket)

Проблема возникает, когда я обрезаю изображение с помощью 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 Ответ

2 голосов
/ 28 июля 2011

Вот как это работает:

  • Вы сохраняете файл в amazon s3
  • Вы запрашиваете файл через CDN
  • CDN проверяет свой кеш, если файл доступен
  • Если нет в наличии, запросить файл у s3, кэшировать его и отправить
  • Если доступно, подавать из кеша. Этот шаг гарантирует, что ваши пользователи получают оптимальный опыт. Если CDN получает файл от s3 каждый раз, то это займет больше времени, чем пользователь получает файл напрямую от s3, что лишит цели CDN.
  • Вы обрезаете изображение и сохраняете измененный файл в s3
  • Вы запрашиваете CDN для файла, ожидая, что он даст вам обрезанный файл
  • CDN проверяет свой кэш на наличие файла, находит его и передает файл из кэша. Он не спрашивает s3 снова, был ли файл изменен

Теперь самый оптимальный способ, который я могу придумать, это загрузить обрезанное изображение с новым именем файла. Так что, когда CDN проверяет свой кэш, он не находит его там и запрашивает s3 для файла. Вы можете удалить старый файл в фоновом режиме, используя delayed_job или resque.

Надеюсь, это проясняет ситуацию.

...