From a3c4ceae947da1e1ce7e49b3acb1ac45e03b542a Mon Sep 17 00:00:00 2001 From: Hammat Wele Date: Thu, 5 Sep 2024 18:56:40 +0000 Subject: [PATCH] Bug 33857: Avoid increasing file size while uploading image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch prevents image size from increasing while uploading by keeping the original image format Test plan: 1. Download the attached image large-image.jpg --> It should be ~170kB and 1000×1500 pixels 2. Enable LocalCoverImages in System preferences 3. Find a record in the staff interface 4. Go to "Images" tab 5. Upload large-image.jpg image 5.1. Click on "Upload" 5.2. Click on "Drop files here or click to select a file" 5.3. Choose picture (large-image.jpg) 5.4. Click on "Process images" 6. Click on image for large image 7. Right-click on the image and save it --> It is ~930kB and 600x900 pixels 8. Apply the patch 9. Detele the previous uploaded image 10. Repeat step 3, 4, 5, 6, 7 --> The image is ~92kB and 600x900 pixels 11. prove t/db_dependent/Koha/CoverImages.t --> All tests should be successful --- Koha/CoverImage.pm | 7 +-- .../prog/en/modules/tools/upload-images.tt | 2 + .../intranet-tmpl/prog/js/upload-images.js | 2 + t/db_dependent/Koha/CoverImages.t | 52 ++++++++++++++++++- tools/upload-cover-image.pl | 4 +- 5 files changed, 62 insertions(+), 5 deletions(-) diff --git a/Koha/CoverImage.pm b/Koha/CoverImage.pm index 8a67fa1d92..7a8e2ca353 100644 --- a/Koha/CoverImage.pm +++ b/Koha/CoverImage.pm @@ -63,9 +63,10 @@ sub new { my $fullsize = $class->_scale_image( $src_image, 600, 800 ); # MAX pixel dims are 600 X 800 for full-size image... - $params->{mimetype} = 'image/png'; - $params->{imagefile} = $fullsize->png(); - $params->{thumbnail} = $thumbnail->png(); + $params->{mimetype} = $params->{mimetype} // 'image/png'; + my ( $app, $format ) = split('/',$params->{mimetype}); + $params->{imagefile} = $fullsize->$format(); + $params->{thumbnail} = $thumbnail->$format(); } return $class->SUPER::new($params); diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/upload-images.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/upload-images.tt index b440096787..7724fddfe5 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/upload-images.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/upload-images.tt @@ -227,9 +227,11 @@ [% IF itemnumber %] + [% ELSIF biblionumber %] + [% END %]
diff --git a/koha-tmpl/intranet-tmpl/prog/js/upload-images.js b/koha-tmpl/intranet-tmpl/prog/js/upload-images.js index cbe226f4f7..20129115df 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/upload-images.js +++ b/koha-tmpl/intranet-tmpl/prog/js/upload-images.js @@ -93,7 +93,9 @@ function prepUpLoad(event) { $("#fileuploadstatus, #upload_options").show(); var fd = new FormData(); fd.append("file", file); + $("#mimetype").val(''); if (ParseFile(file)) { + $("#mimetype").val(file.type); StartUpload(fd); } } diff --git a/t/db_dependent/Koha/CoverImages.t b/t/db_dependent/Koha/CoverImages.t index 953947e62d..6525c66e67 100755 --- a/t/db_dependent/Koha/CoverImages.t +++ b/t/db_dependent/Koha/CoverImages.t @@ -19,7 +19,7 @@ use Modern::Perl; -use Test::More tests => 14; +use Test::More tests => 23; use Test::Exception; use FindBin '$Bin'; @@ -96,4 +96,54 @@ Koha::CoverImage->new( is( $biblio->cover_images->count, 3, ); is( $item->cover_images->count, 2, ); +$logo_filepath = "$Bin/../../../koha-tmpl/intranet-tmpl/prog/img/koha-logo.gif"; +my $mimetype = 'image/gif'; +$image = Koha::CoverImage->new( + { + biblionumber => $biblio->biblionumber, + src_image => GD::Image->new($logo_filepath), + mimetype => $mimetype + } +)->store; +$cover_image = $biblio->cover_images->last; +ok( $cover_image->imagefile, 'image is stored in imagefile' ); +ok( $cover_image->thumbnail, 'thumbnail has been generated' ); +is( + $cover_image->mimetype, $mimetype, + 'The original mimetype has been kept' +); + +$logo_filepath = "$Bin/../../../koha-tmpl/intranet-tmpl/prog/img/koha-logo.png"; +$mimetype = 'image/png'; +$image = Koha::CoverImage->new( + { + biblionumber => $biblio->biblionumber, + src_image => GD::Image->new($logo_filepath), + mimetype => $mimetype + } +)->store; +$cover_image = $biblio->cover_images->last; +ok( $cover_image->imagefile, 'image is stored in imagefile' ); +ok( $cover_image->thumbnail, 'thumbnail has been generated' ); +is( + $cover_image->mimetype, $mimetype, + 'The original mimetype has been kept' +); + +$logo_filepath = "$Bin/../../../koha-tmpl/intranet-tmpl/lib/greybox/GreyBox_v5_5/static_files/night_valley.jpg"; +$mimetype = 'image/jpeg'; +$image = Koha::CoverImage->new( + { + biblionumber => $biblio->biblionumber, + src_image => GD::Image->new($logo_filepath), + mimetype => $mimetype + } +)->store; +$cover_image = $biblio->cover_images->last; +ok( $cover_image->imagefile, 'image is stored in imagefile' ); +ok( $cover_image->thumbnail, 'thumbnail has been generated' ); +is( + $cover_image->mimetype, $mimetype, + 'The original mimetype has been kept' +); $schema->storage->txn_rollback; diff --git a/tools/upload-cover-image.pl b/tools/upload-cover-image.pl index d7cff847dc..a134fc2fb6 100755 --- a/tools/upload-cover-image.pl +++ b/tools/upload-cover-image.pl @@ -67,6 +67,7 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( my $filetype = $input->param('filetype'); my $biblionumber = $input->param('biblionumber'); my $itemnumber = $input->param('itemnumber'); +my $mimetype = $input->param('mimetype'); my $replace = !C4::Context->preference("AllowMultipleCovers") || $input->param('replace'); my $op = $input->param('op') // q{}; @@ -118,7 +119,8 @@ if ( $op eq 'cud-process' && $fileID ) { { biblionumber => $biblionumber, itemnumber => $itemnumber, - src_image => $srcimage + src_image => $srcimage, + mimetype => $mimetype } )->store; }; -- 2.34.1