From 700b9759258496dad9a7c92ecf907d67334b78d7 Mon Sep 17 00:00:00 2001 From: kayrus Date: Fri, 20 Nov 2015 23:28:31 +0100 Subject: Added additional filetypes (pdf,tif,tiff) for thumbnails generation --- app/models/attachment.rb | 6 +++--- lib/redmine/thumbnail.rb | 4 ++-- test/fixtures/attachments.yml | 14 ++++++++++++++ .../files/2016/05/146435549450_testfile_1.pdf | Bin 0 -> 7870 bytes test/unit/attachment_test.rb | 20 ++++++++++++++++++-- 5 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 test/fixtures/files/2016/05/146435549450_testfile_1.pdf diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 3d16f57..03d9ec4 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -193,7 +193,7 @@ class Attachment < ActiveRecord::Base end def image? - !!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png)$/i) + !!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png|pdf|tiff|tif)$/i) end def thumbnailable? @@ -214,7 +214,7 @@ class Attachment < ActiveRecord::Base size = Setting.thumbnails_size.to_i end size = 100 unless size > 0 - target = File.join(self.class.thumbnails_storage_path, "#{id}_#{digest}_#{size}.thumb") + target = File.join(self.class.thumbnails_storage_path, "#{id}_#{digest}_#{size}.thumb.png") begin Redmine::Thumbnail.generate(self.diskfile, target, size) @@ -227,7 +227,7 @@ class Attachment < ActiveRecord::Base # Deletes all thumbnails def self.clear_thumbnails - Dir.glob(File.join(thumbnails_storage_path, "*.thumb")).each do |file| + Dir.glob(File.join(thumbnails_storage_path, "*.thumb.png")).each do |file| File.delete file end end diff --git a/lib/redmine/thumbnail.rb b/lib/redmine/thumbnail.rb index 9321c7b..66c2f66 100644 --- a/lib/redmine/thumbnail.rb +++ b/lib/redmine/thumbnail.rb @@ -29,7 +29,7 @@ module Redmine return nil unless convert_available? unless File.exists?(target) # Make sure we only invoke Imagemagick if this is actually an image - unless File.open(source) {|f| MimeMagic.by_magic(f).try(:image?)} + unless File.open(source) {|f| MimeMagic.by_magic(f).try(:image?) || MimeMagic.by_magic(f).child_of?('application/pdf')} return nil end directory = File.dirname(target) @@ -37,7 +37,7 @@ module Redmine FileUtils.mkdir_p directory end size_option = "#{size}x#{size}>" - cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -thumbnail #{shell_quote size_option} #{shell_quote target}" + cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source}[0] -thumbnail #{shell_quote size_option} #{shell_quote target}" unless system(cmd) logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}") return nil diff --git a/test/fixtures/attachments.yml b/test/fixtures/attachments.yml index 6f56c08..ad23914 100644 --- a/test/fixtures/attachments.yml +++ b/test/fixtures/attachments.yml @@ -267,3 +267,17 @@ attachments_020: filename: root_attachment.txt filesize: 54 author_id: 2 +attachments_021: + content_type: application/pdf + downloads: 0 + created_on: 2016-05-27 15:23:14 +09:00 + disk_filename: 146435549450_testfile_1.pdf + disk_directory: "2016/05" + container_id: 14 + digest: ab39db5ed28060b91c9d9b086473d65a + id: 21 + container_type: Issue + description: "" + filename: testfile.pdf + filesize: 7870 + author_id: 2 diff --git a/test/fixtures/files/2016/05/146435549450_testfile_1.pdf b/test/fixtures/files/2016/05/146435549450_testfile_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..28f9f181154e1c22dd5c3f71e15ce87e1d498173 GIT binary patch literal 7870 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 'test.jpg').thumbnailable? end + def test_thumbnailable_should_be_true_for_pdfs + assert_equal true, Attachment.new(:filename => 'test.pdf').thumbnailable? + end + def test_thumbnailable_should_be_true_for_non_images assert_equal false, Attachment.new(:filename => 'test.txt').thumbnailable? end @@ -402,9 +406,21 @@ class AttachmentTest < ActiveSupport::TestCase attachment = Attachment.find(16) Attachment.clear_thumbnails - assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb')).size" do + assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb.png')).size" do + thumbnail = attachment.thumbnail + assert_equal "16_8e0294de2441577c529f170b6fb8f638_100.thumb.png", File.basename(thumbnail) + assert File.exists?(thumbnail) + end + end + + def test_thumbnail_should_generate_the_thumbnail_from_pdf + set_fixtures_attachments_directory + attachment = Attachment.find(21) + Attachment.clear_thumbnails + + assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb.png')).size" do thumbnail = attachment.thumbnail - assert_equal "16_8e0294de2441577c529f170b6fb8f638_100.thumb", File.basename(thumbnail) + assert_equal "21_ab39db5ed28060b91c9d9b086473d65a_100.thumb.png", File.basename(thumbnail) assert File.exists?(thumbnail) end end -- 1.9.1