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
18 # with Koha; if not, write to the Free Software Foundation, Inc.,
19 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #use warnings; FIXME - Bug 2505
24 use C4::Auth qw/get_session/;
27 use vars qw($VERSION);
30 # set the version for version checking
36 C4::UploadedFile - manage files uploaded by the user
43 # create and store data
44 my $uploaded_file = C4::UploadedFile->new($sessionID);
45 my $fileID = $uploaded_file->id();
46 $uploaded_file->name('c:\temp\file.mrc');
47 $uploaded_file->max_size(1024);
48 while ($have_more_data) {
49 $uploaded_file->stash($data, $bytes_read);
51 $uploaded_file->done();
53 # check status of current file upload
54 my $progress = C4::UploadedFile->upload_progress($sessionID);
56 # get file handle for reading uploaded file
57 my $uploaded_file = C4::UploadedFile->fetch($fileID);
58 my $fh = $uploaded_file->fh();
62 Stores files uploaded by the user from their web browser. The
63 uploaded files are temporary and at present are not guaranteed
64 to survive beyond the life of the user's session.
66 This module allows for tracking the progress of the file
67 currently being uploaded.
69 TODO: implement secure persistant storage of uploaded files.
81 my $uploaded_file = C4::UploadedFile->new($sessionID);
85 Creates a new object to represent the uploaded file. Requires
86 the current session ID.
92 my $sessionID = shift;
96 $self->{'sessionID'} = $sessionID;
97 $self->{'fileID'} = Digest::MD5::md5_hex(Digest::MD5::md5_hex(time().{}.rand().{}.$$));
98 # FIXME - make staging area configurable
99 my $TEMPROOT = "/tmp";
100 my $OUTPUTDIR = "$TEMPROOT/$sessionID";
102 my $tmp_file_name = "$OUTPUTDIR/$self->{'fileID'}";
103 my $fh = new IO::File $tmp_file_name, "w";
104 unless (defined $fh) {
107 $fh->binmode(); # Windows compatibility
109 $self->{'tmp_file_name'} = $tmp_file_name;
110 $self->{'max_size'} = 0;
111 $self->{'progress'} = 0;
112 $self->{'name'} = '';
117 my $session = get_session($sessionID);
118 $session->param('current_upload', $self->{'fileID'});
128 my $prefix = "upload_" . $self->{'fileID'};
129 my $session = get_session($self->{'sessionID'});
131 # temporarily take file handle out of structure
132 my $fh = $self->{'fh'};
133 delete $self->{'fh'};
134 $session->param($prefix, $self);
143 my $fileID = $uploaded_file->id();
151 return $self->{'fileID'};
158 my $name = $uploaded_file->name();
159 $uploaded_file->name($name);
163 Accessor method for the name by which the file is to be known.
170 $self->{'name'} = shift;
173 return $self->{'name'};
181 my $max_size = $uploaded_file->max_size();
182 $uploaded_file->max_size($max_size);
186 Accessor method for the maximum size of the uploaded file.
192 @_ ? $self->{'max_size'} = shift : $self->{'max_size'};
199 $uploaded_file->stash($dataref, $bytes_read);
203 Write C<$dataref> to the temporary file. C<$bytes_read> represents
204 the number of bytes (out of C<$max_size>) transmitted so far.
211 my $bytes_read = shift;
213 my $fh = $self->{'fh'};
216 my $percentage = int(($bytes_read / $self->{'max_size'}) * 100);
217 if ($percentage > $self->{'progress'}) {
218 $self->{'progress'} = $percentage;
227 $uploaded_file->done();
231 Indicates that all of the bytes have been uploaded.
237 $self->{'progress'} = 'done';
238 $self->{'fh'}->close();
242 =head2 upload_progress
246 my $upload_progress = C4::UploadFile->upload_progress($sessionID);
250 Returns (as an integer from 0 to 100) the percentage
251 progress of the current file upload.
255 sub upload_progress {
256 my ($class, $sessionID) = shift;
258 my $session = get_session($sessionID);
260 my $fileID = $session->param('current_upload');
262 my $reported_progress = 0;
263 if (defined $fileID and $fileID ne "") {
264 my $file = C4::UploadedFile->fetch($sessionID, $fileID);
265 my $progress = $file->{'progress'};
266 if (defined $progress) {
267 if ($progress eq "done") {
268 $reported_progress = 100;
270 $reported_progress = $progress;
274 return $reported_progress;
281 my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
285 Retrieves an uploaded file object from the current session.
291 my $sessionID = shift;
294 my $session = get_session($sessionID);
295 my $prefix = "upload_$fileID";
296 my $self = $session->param($prefix);
297 my $fh = new IO::File $self->{'tmp_file_name'}, "r";
308 my $fh = $uploaded_file->fh();
312 Returns an IO::File handle to read the uploaded file.
318 return $self->{'fh'};
326 Koha Development Team <info@koha.org>
328 Galen Charlton <galen.charlton@liblime.com>