1 package C4::UploadedFile;
3 # Copyright (C) 2007 LibLime
4 # Galen Charlton <galen.charlton@liblime.com>
6 # This file is part of Koha.
8 # Koha is free software; you can redistribute it and/or modify it under the
9 # terms of the GNU General Public License as published by the Free Software
10 # Foundation; either version 2 of the License, or (at your option) any later
13 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
14 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License along with
18 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
19 # Suite 330, Boston, MA 02111-1307 USA
23 use C4::Auth qw/get_session/;
26 use vars qw($VERSION);
28 # set the version for version checking
33 C4::UploadedFile - manage files uploaded by the user
40 # create and store data
41 my $uploaded_file = C4::UploadedFile->new($sessionID);
42 my $fileID = $uploaded_file->id();
43 $uploaded_file->name('c:\temp\file.mrc');
44 $uploaded_file->max_size(1024);
45 while ($have_more_data) {
46 $uploaded_file->stash($data, $bytes_read);
48 $uploaded_file->done();
50 # check status of current file upload
51 my $progress = C4::UploadedFile->upload_progress($sessionID);
53 # get file handle for reading uploaded file
54 my $uploaded_file = C4::UploadedFile->fetch($fileID);
55 my $fh = $uploaded_file->fh();
59 Stores files uploaded by the user from their web browser. The
60 uploaded files are temporary and at present are not guaranteed
61 to survive beyond the life of the user's session.
63 This module allows for tracking the progress of the file
64 currently being uploaded.
66 TODO: implement secure persistant storage of uploaded files.
78 my $uploaded_file = C4::UploadedFile->new($sessionID);
82 Creates a new object to represent the uploaded file. Requires
83 the current session ID.
89 my $sessionID = shift;
93 $self->{'sessionID'} = $sessionID;
94 $self->{'fileID'} = Digest::MD5::md5_hex(Digest::MD5::md5_hex(time().{}.rand().{}.$$));
95 # FIXME - make staging area configurable
96 my $TEMPROOT = "/tmp";
97 my $OUTPUTDIR = "$TEMPROOT/$sessionID";
99 my $tmp_file_name = "$OUTPUTDIR/$self->{'fileID'}";
100 my $fh = new IO::File $tmp_file_name, "w";
101 unless (defined $fh) {
104 $fh->binmode(); # Windows compatibility
106 $self->{'tmp_file_name'} = $tmp_file_name;
107 my $session = get_session($sessionID);
108 $session->param("$self->{'fileID'}.uploaded_tmpfile", $tmp_file_name);
109 $session->param('current_upload', $self->{'fileID'});
111 $self->{'session'} = $session;
112 $self->{'name'} = '';
113 $self->{'max_size'} = 0;
114 $self->{'progress'} = 0;
126 my $fileID = $uploaded_file->id();
134 return $self->{'fileID'};
141 my $name = $uploaded_file->name();
142 $uploaded_file->name($name);
146 Accessor method for the name by which the file is to be known.
153 $self->{'name'} = shift;
154 $self->{'session'}->param("$self->{'fileID'}.uploaded_filename", $self->{'name'});
155 $self->{'session'}->flush();
157 return $self->{'name'};
165 my $max_size = $uploaded_file->max_size();
166 $uploaded_file->max_size($max_size);
170 Accessor method for the maximum size of the uploaded file.
176 @_ ? $self->{'max_size'} = shift : $self->{'max_size'};
183 $uploaded_file->stash($dataref, $bytes_read);
187 Write C<$dataref> to the temporary file. C<$bytes_read> represents
188 the number of bytes (out of C<$max_size>) transmitted so far.
195 my $bytes_read = shift;
197 my $fh = $self->{'fh'};
200 my $percentage = int(($bytes_read / $self->{'max_size'}) * 100);
201 if ($percentage > $self->{'progress'}) {
202 $self->{'progress'} = $percentage;
203 $self->{'session'}->param("$self->{'fileID'}.uploadprogress", $self->{'progress'});
204 $self->{'session'}->flush();
212 $uploaded_file->done();
216 Indicates that all of the bytes have been uploaded.
222 $self->{'session'}->param("$self->{'fileID'}.uploadprogress", 'done');
223 $self->{'session'}->flush();
224 $self->{'fh'}->close();
227 =head2 upload_progress
231 my $upload_progress = C4::UploadFile->upload_progress($sessionID);
235 Returns (as an integer from 0 to 100) the percentage
236 progress of the current file upload.
240 sub upload_progress {
241 my ($class, $sessionID) = shift;
243 my $session = get_session($sessionID);
245 my $fileID = $session->param('current_upload');
247 my $reported_progress = 0;
248 if (defined $fileID and $fileID ne "") {
249 my $progress = $session->param("$fileID.uploadprogress");
250 if (defined $progress) {
251 if ($progress eq "done") {
252 $reported_progress = 100;
254 $reported_progress = $progress;
258 return $reported_progress;
265 my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
269 Retrieves an uploaded file object from the current session.
275 my $sessionID = shift;
280 $self->{'sessionID'} = $sessionID;
281 $self->{'fileID'} = $fileID;
282 my $session = get_session($sessionID);
283 $self->{'session'} = $session;
284 $self->{'tmp_file_name'} = $session->param("$self->{'fileID'}.uploaded_tmpfile");
285 $self->{'name'} = $session->param("$self->{'fileID'}.uploaded_filename");
286 my $fh = new IO::File $self->{'tmp_file_name'}, "r";
298 my $fh = $uploaded_file->fh();
302 Returns an IO::File handle to read the uploaded file.
308 return $self->{'fh'};
313 Koha Development Team <info@koha.org>
315 Galen Charlton <galen.charlton@liblime.com>