# Esta clase maneja los thumbails de las imagenes. Maneja cache de los archivos # # Author:: Fabian Ramirez (mailto:framirez@ayerviernes.com) # Copyright:: Copyright (c) 2009 AyerViernes S.A. # License:: GPL class ThumbController < ApplicationController # Incluimos la libreria require 'RMagick' # Funcion principal para la generación de thumbails # * params[:w] = Ancho # * params[:folder] = Carpeta donde se encuentra almacenada def index # Donde esta la imagen almacenada path = "public/images/"+ params[:folder].to_s + "/" + params[:specs].join("/") || "" # Necesito leer la imagen para tomar sus propiedades begin # Instanciamos el objeto img = Magick::Image.read(path).first # El alto esta definido por el usuario o por el sistema if params[:h].nil? height = img.rows/(img.columns/params[:w].to_i) else height = params[:h] end rescue render :text => "No source image. Please check the file exists into the path " + RAILS_ROOT + "/" + path end # Donde esta la imagen cacheada pathcache = "public/images/"+ params[:folder].to_s + "/cache/" + params[:w].to_s + "x" + height.to_s + "/" + params[:specs].join("/") || "" # Tengo que verificar que exista la cache if check_cache(path, pathcache) # Leo la imagen img = Magick::Image.read(pathcache).first # Enviamos la respuesta response.headers["Content-type"] = img.mime_type render :text => img.to_blob # Cuando no exista la cache elsif File.exists? path # Leemos la imagen img_temporal= Magick::Image.read(path).first # La achicamos al tamaño que se desea img = img_temporal.resize_to_fit(params[:w], height) # Creamos el directorio Dir.mkdir("#{RAILS_ROOT}/public/images/" + params[:folder].to_s + "/cache") if !File.directory?("#{RAILS_ROOT}/public/images/" + params[:folder].to_s + "/cache") Dir.mkdir("#{RAILS_ROOT}/public/images/" + params[:folder].to_s + "/cache/"+params[:w] + "x" + height.to_s) if !File.directory?("#{RAILS_ROOT}/public/images/" + params[:folder].to_s + "/cache/"+params[:w] + "x" + height.to_s) # Fin de creacion de directorios # Escribimos la imagen dentro del disco img.write("#{RAILS_ROOT}/public/images/" + params[:folder].to_s + "/cache/"+ params[:w] + "x" + height.to_s + "/" + params[:specs].join("/")) # Enviamos la respuesta response.headers["Content-type"] = img.mime_type render :text => img.to_blob end end private # Verifica si existe o no el archivo cache, y si la fecha de creacion es reciente # * file = Ruta de la imagen # * filecached = Ruta de la imagen cacheada def check_cache(file, filecached) File.exists?(filecached) && (File.stat( filecached ).mtime.to_i > File.stat( file ).mtime.to_i) end end