From 70d9de90bdcb80c42157e2a7c5630d58f288bc21 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Mon, 13 Jul 2015 21:40:33 +0200 Subject: [PATCH] Added file extension to logo in start page to show logo also in IE 11. --- db/migrate/20150713000001_update_logo.rb | 8 ++ lib/static_assets.rb | 131 ++++++++++++++++++----- 2 files changed, 114 insertions(+), 25 deletions(-) create mode 100644 db/migrate/20150713000001_update_logo.rb diff --git a/db/migrate/20150713000001_update_logo.rb b/db/migrate/20150713000001_update_logo.rb new file mode 100644 index 000000000..db4db6203 --- /dev/null +++ b/db/migrate/20150713000001_update_logo.rb @@ -0,0 +1,8 @@ +class UpdateLogo < ActiveRecord::Migration + def up + + return if !Setting.find_by(name: 'product_logo') + StaticAssets.read + StaticAssets.sync + end +end diff --git a/lib/static_assets.rb b/lib/static_assets.rb index a8638ada6..981368bee 100644 --- a/lib/static_assets.rb +++ b/lib/static_assets.rb @@ -1,6 +1,19 @@ module StaticAssets - def self.data_url_attributes( data_url ) +=begin + + file_attributes = StaticAssets.data_url_attributes(data_url) + +returns + + { + mime_type: 'image/png', + content: image_bin_content, + } + +=end + + def self.data_url_attributes(data_url) data = {} if data_url =~ /^data:(.+?);base64,(.+?)$/ data[:mime_type] = $1 @@ -10,73 +23,141 @@ module StaticAssets fail "Unable to parse data url: #{data_url.substr(0, 100)}" end - # store image 1:1 - def self.store_raw( content, content_type ) - Store.remove( object: 'System::Logo', o_id: 1 ) - Store.add( +=begin + +store image 1:1 in backend and return filename + + filename = StaticAssets.store_raw( content, content_type ) + +returns + + filename # hash.png + +=end + + def self.store_raw(content, content_type) + Store.remove(object: 'System::Logo', o_id: 1) + file = Store.add( object: 'System::Logo', o_id: 1, data: content, - filename: 'image', + filename: 'logo_raw', preferences: { 'Content-Type' => content_type }, ) - Digest::MD5.hexdigest( content ) + filename(file) end - # read raw 1:1 +=begin + +read image 1:1 size in backend and return file (Store model) + + store = StaticAssets.read_raw + +returns + + store # Store model, e.g. store.content or store.preferences + +=end + def self.read_raw - list = Store.list( object: 'System::Logo', o_id: 1 ) + list = Store.list(object: 'System::Logo', o_id: 1) if list && list[0] return Store.find( list[0] ) end fail 'No such raw logo!' end - # store image in right size - def self.store( content, content_type ) - Store.remove( object: 'System::Logo', o_id: 2 ) - Store.add( +=begin + +store image in right size (resized) in backend and return filename + + filename = StaticAssets.store( content, content_type ) + +returns + + filename # hash.png + +=end + + def self.store(content, content_type) + Store.remove(object: 'System::Logo', o_id: 2) + file = Store.add( object: 'System::Logo', o_id: 2, data: content, - filename: 'image', + filename: 'logo', preferences: { 'Content-Type' => content_type }, ) StaticAssets.sync - Digest::MD5.hexdigest( content ) + filename(file) end - # read image +=begin + +read image size from backend (if not exists, read 1:1 size) and return file (Store model) + + store = StaticAssets.read + +returns + + store # Store model, e.g. store.content or store.preferences + +=end + def self.read # use reduced dimensions - list = Store.list( object: 'System::Logo', o_id: 2 ) + list = Store.list(object: 'System::Logo', o_id: 2) # as fallback use 1:1 if !list || !list[0] - list = Store.list( object: 'System::Logo', o_id: 1 ) + list = Store.list(object: 'System::Logo', o_id: 1) end # store hash in config if list && list[0] - file = Store.find( list[0] ) - hash = Digest::MD5.hexdigest( file.content ) - Setting.set('product_logo', hash) + file = Store.find(list[0]) + filelocation = filename(file) + Setting.set('product_logo', filelocation) return file end end - # sync image to fs +=begin + +generate filename based on Store model + + filename = StaticAssets.filename(store) + +=end + + def self.filename(file) + hash = Digest::MD5.hexdigest(file.content) + extention = '' + if file.preferences['Content-Type'] =~ /jpg|jpeg/i + extention = '.jpg' + elsif file.preferences['Content-Type'] =~ /png/i + extention = '.png' + end + "#{hash}#{extention}" + end + +=begin + +sync image to fs (public/assets/images/hash.png) + + StaticAssets.sync + +=end + def self.sync file = read return if !file - - hash = Digest::MD5.hexdigest( file.content ) - path = "#{Rails.root}/public/assets/images/#{hash}" + path = "#{Rails.root}/public/assets/images/#{filename(file)}" File.open( path, 'wb' ) do |f| f.puts file.content end