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);
29 # set the version for version checking
35 C4::UploadedFile - manage files uploaded by the user
42 # create and store data
43 my $uploaded_file = C4::UploadedFile->new($sessionID);
44 my $fileID = $uploaded_file->id();
45 $uploaded_file->name('c:\temp\file.mrc');
46 $uploaded_file->max_size(1024);
47 while ($have_more_data) {
48 $uploaded_file->stash($data, $bytes_read);
50 $uploaded_file->done();
52 # check status of current file upload
53 my $progress = C4::UploadedFile->upload_progress($sessionID);
55 # get file handle for reading uploaded file
56 my $uploaded_file = C4::UploadedFile->fetch($fileID);
57 my $fh = $uploaded_file->fh();
61 Stores files uploaded by the user from their web browser. The
62 uploaded files are temporary and at present are not guaranteed
63 to survive beyond the life of the user's session.
65 This module allows for tracking the progress of the file
66 currently being uploaded.
68 TODO: implement secure persistant storage of uploaded files.
80 my $uploaded_file = C4::UploadedFile->new($sessionID);
84 Creates a new object to represent the uploaded file. Requires
85 the current session ID.
91 my $sessionID = shift;
95 $self->{'sessionID'} = $sessionID;
96 $self->{'fileID'} = Digest::MD5::md5_hex(Digest::MD5::md5_hex(time().{}.rand().{}.$$));
97 # FIXME - make staging area configurable
98 my $TEMPROOT = "/tmp";
99 my $OUTPUTDIR = "$TEMPROOT/$sessionID";
101 my $tmp_file_name = "$OUTPUTDIR/$self->{'fileID'}";
102 my $fh = new IO::File $tmp_file_name, "w";
103 unless (defined $fh) {
106 $fh->binmode(); # Windows compatibility
108 $self->{'tmp_file_name'} = $tmp_file_name;
109 $self->{'max_size'} = 0;
110 $self->{'progress'} = 0;
111 $self->{'name'} = '';
116 my $session = get_session($sessionID);
117 $session->param('current_upload', $self->{'fileID'});
127 my $prefix = "upload_" . $self->{'fileID'};
128 my $session = get_session($self->{'sessionID'});
130 # temporarily take file handle out of structure
131 my $fh = $self->{'fh'};
132 delete $self->{'fh'};
133 $session->param($prefix, $self);
142 my $fileID = $uploaded_file->id();
150 return $self->{'fileID'};
157 my $name = $uploaded_file->name();
158 $uploaded_file->name($name);
162 Accessor method for the name by which the file is to be known.
169 $self->{'name'} = shift;
172 return $self->{'name'};
180 my $max_size = $uploaded_file->max_size();
181 $uploaded_file->max_size($max_size);
185 Accessor method for the maximum size of the uploaded file.
191 @_ ? $self->{'max_size'} = shift : $self->{'max_size'};
198 $uploaded_file->stash($dataref, $bytes_read);
202 Write C<$dataref> to the temporary file. C<$bytes_read> represents
203 the number of bytes (out of C<$max_size>) transmitted so far.
210 my $bytes_read = shift;
212 my $fh = $self->{'fh'};
215 my $percentage = int(($bytes_read / $self->{'max_size'}) * 100);
216 if ($percentage > $self->{'progress'}) {
217 $self->{'progress'} = $percentage;
226 $uploaded_file->done();
230 Indicates that all of the bytes have been uploaded.
236 $self->{'progress'} = 'done';
237 $self->{'fh'}->close();
241 =head2 upload_progress
245 my $upload_progress = C4::UploadFile->upload_progress($sessionID);
249 Returns (as an integer from 0 to 100) the percentage
250 progress of the current file upload.
254 sub upload_progress {
255 my ($class, $sessionID) = shift;
257 my $session = get_session($sessionID);
259 my $fileID = $session->param('current_upload');
261 my $reported_progress = 0;
262 if (defined $fileID and $fileID ne "") {
263 my $file = C4::UploadedFile->fetch($sessionID, $fileID);
264 my $progress = $file->{'progress'};
265 if (defined $progress) {
266 if ($progress eq "done") {
267 $reported_progress = 100;
269 $reported_progress = $progress;
273 return $reported_progress;
280 my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
284 Retrieves an uploaded file object from the current session.
290 my $sessionID = shift;
293 my $session = get_session($sessionID);
294 my $prefix = "upload_$fileID";
295 my $self = $session->param($prefix);
296 my $fh = new IO::File $self->{'tmp_file_name'}, "r";
307 my $fh = $uploaded_file->fh();
311 Returns an IO::File handle to read the uploaded file.
317 return $self->{'fh'};
325 Koha Development Team <info@koha.org>
327 Galen Charlton <galen.charlton@liblime.com>