Bug 26145: Add the ability to upload a cover image per item
[srvgit] / tools / upload-cover-image.pl
1 #!/usr/bin/perl
2 #
3 # Copyright 2011 C & P Bibliography Services
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19 #
20 #
21 #
22
23 =head1 NAME
24
25 upload-cover-image.pl - Script for handling uploading of both single and bulk coverimages and importing them into the database.
26
27 =head1 SYNOPSIS
28
29 upload-cover-image.pl
30
31 =head1 DESCRIPTION
32
33 This script is called and presents the user with an interface allowing him/her to upload a single cover image or bulk cover images via a zip file.
34 Images will be resized into thumbnails of 140x200 pixels and larger images of
35 800x600 pixels. If the images that are uploaded are larger, they will be
36 resized, maintaining aspect ratio.
37
38 =cut
39
40 use Modern::Perl;
41
42 use File::Temp;
43 use CGI qw ( -utf8 );
44 use GD;
45 use C4::Context;
46 use C4::Auth;
47 use C4::Output;
48 use C4::Images;
49 use Koha::Items;
50 use Koha::UploadedFiles;
51 use C4::Log;
52
53 my $debug = 1;
54
55 my $input = new CGI;
56
57 my $fileID = $input->param('uploadedfileid');
58 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
59     {
60         template_name   => "tools/upload-images.tt",
61         query           => $input,
62         type            => "intranet",
63         flagsrequired   => { tools => 'upload_local_cover_images' },
64         debug           => 0,
65     }
66 );
67
68 my $filetype       = $input->param('filetype');
69 my $biblionumber   = $input->param('biblionumber');
70 my $itemnumber     = $input->param('itemnumber');
71 #my $uploadfilename = $input->param('uploadfile'); # obsolete?
72 my $replace        = !C4::Context->preference("AllowMultipleCovers")
73   || $input->param('replace');
74 my $op        = $input->param('op');
75 my %cookies   = parse CGI::Cookie($cookie);
76 my $sessionID = $cookies{'CGISESSID'}->value;
77
78 my $error;
79
80 $template->param(
81     filetype     => $filetype,
82     biblionumber => $biblionumber,
83     itemnumber   => $itemnumber,
84 );
85
86 my $total = 0;
87
88 if ($fileID) {
89     my $upload = Koha::UploadedFiles->find( $fileID );
90     if ( $filetype eq 'image' ) {
91         my $fh       = $upload->file_handle;
92         my $srcimage = GD::Image->new($fh);
93         $fh->close if $fh;
94         if ( defined $srcimage ) {
95             my $dberror = PutImage( { biblionumber => $biblionumber, itemnumber => $itemnumber, src_image => $srcimage, replace => $replace } );
96             if ($dberror) {
97                 $error = 'DBERR';
98             }
99             else {
100                 $total = 1;
101             }
102         }
103         else {
104             $error = 'OPNIMG';
105         }
106         undef $srcimage;
107     }
108     else {
109         my $filename = $upload->full_path;
110         my $dirname = File::Temp::tempdir( CLEANUP => 1 );
111         qx/unzip $filename -d $dirname/;
112         my $exit_code = $?;
113         unless ( $exit_code == 0 ) {
114             $error = 'UZIPFAIL';
115         }
116         else {
117             my @directories;
118             push @directories, "$dirname";
119             foreach my $recursive_dir (@directories) {
120                 my $dir;
121                 opendir $dir, $recursive_dir;
122                 while ( my $entry = readdir $dir ) {
123                     push @directories, "$recursive_dir/$entry"
124                       if ( -d "$recursive_dir/$entry" and $entry !~ /^[._]/ );
125                 }
126                 closedir $dir;
127             }
128             foreach my $dir (@directories) {
129                 my $file;
130                 if ( -e "$dir/idlink.txt" ) {
131                     $file = "$dir/idlink.txt";
132                 }
133                 elsif ( -e "$dir/datalink.txt" ) {
134                     $file = "$dir/datalink.txt";
135                 }
136                 else {
137                     next;
138                 }
139                 if ( open( my $fh, '<', $file ) ) {
140                     while ( my $line = <$fh> ) {
141                         my $delim =
142                             ( $line =~ /\t/ ) ? "\t"
143                           : ( $line =~ /,/ )  ? ","
144                           :                     "";
145
146                         #$debug and warn "Delimeter is \'$delim\'";
147                         unless ( $delim eq "," || $delim eq "\t" ) {
148                             warn
149 "Unrecognized or missing field delimeter. Please verify that you are using either a ',' or a 'tab'";
150                             $error = 'DELERR';
151                         }
152                         else {
153                             ( $biblionumber, $filename ) = split $delim, $line, 2;
154                             $biblionumber =~
155                               s/[\"\r\n]//g;    # remove offensive characters
156                             $filename =~ s/[\"\r\n]//g;
157                             $filename =~ s/^\s+//;
158                             $filename =~ s/\s+$//;
159                             if (C4::Context->preference("CataloguingLog")) {
160                                 logaction('CATALOGUING', 'MODIFY', $biblionumber, "biblio cover image: $filename");
161                             }
162                             my $srcimage = GD::Image->new("$dir/$filename");
163                             if ( defined $srcimage ) {
164                                 $total++;
165                                 my $dberror = PutImage(
166                                     {
167                                         biblionumber => $biblionumber,
168                                         src_image    => $srcimage,
169                                         replace      => $replace
170                                     }
171                                 );
172                                 if ($dberror) {
173                                     $error = 'DBERR';
174                                 }
175                             }
176                             else {
177                                 $error = 'OPNIMG';
178                             }
179                             undef $srcimage;
180                         }
181                     }
182                     close($fh);
183                 }
184                 else {
185                     $error = 'OPNLINK';
186                 }
187             }
188         }
189     }
190
191     $template->param(
192         total        => $total,
193         uploadimage  => 1,
194         error        => $error,
195         biblionumber => $biblionumber || Koha::Items->find($itemnumber)->biblionumber,
196         itemnumber   => $itemnumber,
197     );
198 }
199
200 output_html_with_http_headers $input, $cookie, $template->output;
201
202 exit 0;
203
204 =head1 AUTHORS
205
206 Written by Jared Camins-Esakov of C & P Bibliography Services, in part based on
207 code by Koustubha Kale of Anant Corporation and Chris Nighswonger of Foundation
208 Bible College.
209
210 =cut