Slide 60
Slide 60 text
module ImageServer
!class App < Sinatra::!Base
configure :production do
disable :show_exceptions
end
not_found do
respond_with_404
end
set :public_folder, File.join(File.dirname(__FILE__), '..', '..', 'public')
set :available_image_sizes, !{
!!:mini => [106, 71],
!:klein => [138, 92],
!:mittel => [145, 108],
!:mail => [175, 117],
!:gross => [645, 430],
!:grundriss => [617, nil],
!:grundriss_mit_legende => [415, nil]
!}
before do
expires !86400, :public # expire after one day
end
get '/' do
File.read(File.join(settings.public_folder, 'index.html'))
end
!get %r{/hausbilder/(.*)_(#{settings.available_image_sizes.keys.join("|")})\.!(\w+)} do
image_path = params[:captures][0]
requested_size = params[:captures][1].to_sym
image_extension = params[:captures][2]
if settings.available_image_sizes.keys.include?(requested_size)
original_filename = File.join(settings.public_folder, 'hausbilder', "#{!image_path}.#{image_extension}")
if File.!exists?(original_filename)
thumbnail = MiniMagick::Image.open(original_filename)
width, height = settings.available_image_sizes[requested_size]
unless image_extension.downcase.include?(!"svg")
!!if requested_size == :grundriss_mit_legende || requested_size == :!grundriss
thumbnail.combine_options do |c|
c.resize "#{width}x>"
end
elsif requested_size != :gross || is_landscape?(thumbnail)
thumbnail.combine_options do |c|
c.resize "#{width}x#{height}^"
c.gravity !"center"
c.extent "#{width}x#{height}"
end
else
thumbnail.combine_options do |c|
c.resize "#{width}x#{height}"
c.gravity !"center"
c.bordercolor !"#ffffff"
c.border "#{!width/2}x#{!width/2}"
c.extent "#{width}x#{height}"
end
end
end
content_type thumbnail.mime_type
status 200
expires !!86400*365, :public # expire after one week
thumbnail.to_blob
else
respond_with_404
end
end
end
get !"/photos/*" do |image_path|
original_filename = File.join(settings.public_folder, 'dropbox_sync', !image_path.downcase)
requested_width = request[!"w"].to_i
if original_filename != photo_lookup(original_filename)
if requested_width > 0
image = MiniMagick::Image.open(original_filename)
image.combine_options do |option|
option.resize "#{requested_width}x>"
end
content_type image.mime_type
status 200
image.to_blob
else
send_file original_filename
end
else
respond_with_404
end
end
helpers do
def !is_landscape?(image)
image[!"width"] >= image[!"height"]
end
def respond_with_404
content_type !"image/png"
status 404
expires 600, :public_folder # expire after 10 Minutes
File.read(File.join(settings.public_folder, 'images', '!missing_house_picture.png'))
end
def photo_lookup(filename)
!if File.!exists?(filename)
!return filename
elsif File.extname(filename) == !".jpg"
filename_jpeg = filename.gsub(/\.jpg$/, !".jpeg")
return filename_jpeg if File.!exists?(filename_jpeg)
end
end
end
end
end
Image Server