discourse/app/models/optimized_image.rb

86 lines
2 KiB
Ruby
Raw Normal View History

require "digest/sha1"
2013-06-16 04:39:48 -04:00
class OptimizedImage < ActiveRecord::Base
belongs_to :upload
2013-07-07 19:39:08 -04:00
def self.create_for(upload, width, height)
return unless width && height
@image_sorcery_loaded ||= require "image_sorcery"
original_path = "#{Rails.root}/public#{upload.url}"
# create a temp file with the same extension as the original
temp_file = Tempfile.new(["discourse", File.extname(original_path)])
temp_path = temp_file.path
2013-07-07 19:39:08 -04:00
if ImageSorcery.new(original_path).convert(temp_path, resize: "#{width}x#{height}")
thumbnail = OptimizedImage.new({
upload_id: upload.id,
sha1: Digest::SHA1.file(temp_path).hexdigest,
extension: File.extname(temp_path),
2013-07-07 19:39:08 -04:00
width: width,
height: height
})
# make sure the directory exists
FileUtils.mkdir_p Pathname.new(thumbnail.path).dirname
# move the temp file to the right location
File.open(thumbnail.path, "wb") do |f|
f.write temp_file.read
end
end
# close && remove temp file
temp_file.close
temp_file.unlink
thumbnail
2013-06-16 19:00:25 -04:00
end
def destroy
OptimizedImage.transaction do
remove_file
super
end
end
def remove_file
File.delete path
rescue Errno::ENOENT
end
2013-06-16 19:00:25 -04:00
def url
2013-07-10 16:56:25 -04:00
"#{LocalStore.base_url}/#{optimized_path}/#{filename}"
2013-06-16 19:00:25 -04:00
end
def path
2013-07-10 16:56:25 -04:00
"#{LocalStore.base_path}/#{optimized_path}/#{filename}"
2013-06-16 19:00:25 -04:00
end
def optimized_path
2013-07-10 16:56:25 -04:00
"_optimized/#{sha1[0..2]}/#{sha1[3..5]}"
2013-06-16 19:00:25 -04:00
end
2013-06-16 04:39:48 -04:00
def filename
"#{sha1[6..16]}_#{width}x#{height}#{extension}"
2013-06-16 04:39:48 -04:00
end
2013-06-16 19:00:25 -04:00
2013-06-16 04:39:48 -04:00
end
2013-06-16 20:48:58 -04:00
# == Schema Information
#
# Table name: optimized_images
#
# id :integer not null, primary key
# sha1 :string(40) not null
# extension :string(10) not null
2013-06-16 20:48:58 -04:00
# width :integer not null
# height :integer not null
# upload_id :integer not null
#
# Indexes
#
# index_optimized_images_on_upload_id (upload_id)
# index_optimized_images_on_upload_id_and_width_and_height (upload_id,width,height) UNIQUE
#