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
9 # under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # Koha is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with Koha; if not, see <http://www.gnu.org/licenses>.
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
31 $VERSION = 3.07.00.049;
36 C4::UploadedFile - manage files uploaded by the user
41 # create and store data
42 my $uploaded_file = C4::UploadedFile->new($sessionID);
43 my $fileID = $uploaded_file->id();
44 $uploaded_file->name('c:\temp\file.mrc');
45 $uploaded_file->max_size(1024);
46 while ($have_more_data) {
47 $uploaded_file->stash($data, $bytes_read);
49 $uploaded_file->done();
51 # check status of current file upload
52 my $progress = C4::UploadedFile->upload_progress($sessionID);
54 # get file handle for reading uploaded file
55 my $uploaded_file = C4::UploadedFile->fetch($fileID);
56 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 persistent storage of uploaded files.
76 my $uploaded_file = C4::UploadedFile->new($sessionID);
78 Creates a new object to represent the uploaded file. Requires
79 the current session ID.
85 my $sessionID = shift;
89 $self->{'sessionID'} = $sessionID;
90 $self->{'fileID'} = Digest::MD5::md5_hex(Digest::MD5::md5_hex(time().{}.rand().{}.$$));
91 # FIXME - make staging area configurable
92 my $TEMPROOT = "/tmp";
93 my $OUTPUTDIR = "$TEMPROOT/$sessionID";
95 my $tmp_file_name = "$OUTPUTDIR/$self->{'fileID'}";
96 my $fh = new IO::File $tmp_file_name, "w";
97 unless (defined $fh) {
100 $fh->binmode(); # Windows compatibility
102 $self->{'tmp_file_name'} = $tmp_file_name;
103 $self->{'max_size'} = 0;
104 $self->{'progress'} = 0;
105 $self->{'name'} = '';
110 my $session = get_session($sessionID);
111 $session->param('current_upload', $self->{'fileID'});
121 my $prefix = "upload_" . $self->{'fileID'};
122 my $session = get_session($self->{'sessionID'});
124 # temporarily take file handle out of structure
125 my $fh = $self->{'fh'};
126 delete $self->{'fh'};
127 $session->param($prefix, $self);
134 my $fileID = $uploaded_file->id();
140 return $self->{'fileID'};
145 my $name = $uploaded_file->name();
146 $uploaded_file->name($name);
148 Accessor method for the name by which the file is to be known.
155 $self->{'name'} = shift;
158 return $self->{'name'};
164 my $filename = $uploaded_file->filename();
166 Accessor method for the name by which the file is to be known.
173 $self->{'tmp_file_name'} = shift;
176 return $self->{'tmp_file_name'};
182 my $max_size = $uploaded_file->max_size();
183 $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'};
196 $uploaded_file->stash($dataref, $bytes_read);
198 Write C<$dataref> to the temporary file. C<$bytes_read> represents
199 the number of bytes (out of C<$max_size>) transmitted so far.
206 my $bytes_read = shift;
208 my $fh = $self->{'fh'};
211 my $percentage = int(($bytes_read / $self->{'max_size'}) * 100);
212 if ($percentage > $self->{'progress'}) {
213 $self->{'progress'} = $percentage;
220 $uploaded_file->done();
222 Indicates that all of the bytes have been uploaded.
228 $self->{'progress'} = 'done';
229 $self->{'fh'}->close();
233 =head2 upload_progress
235 my $upload_progress = C4::UploadFile->upload_progress($sessionID);
237 Returns (as an integer from 0 to 100) the percentage
238 progress of the current file upload.
242 sub upload_progress {
243 my ($class, $sessionID) = shift;
245 my $session = get_session($sessionID);
247 my $fileID = $session->param('current_upload');
249 my $reported_progress = 0;
250 if (defined $fileID and $fileID ne "") {
251 my $file = C4::UploadedFile->fetch($sessionID, $fileID);
252 my $progress = $file->{'progress'};
253 if (defined $progress) {
254 if ($progress eq "done") {
255 $reported_progress = 100;
257 $reported_progress = $progress;
261 return $reported_progress;
266 my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
268 Retrieves an uploaded file object from the current session.
274 my $sessionID = shift;
277 my $session = get_session($sessionID);
278 my $prefix = "upload_$fileID";
279 my $self = $session->param($prefix);
280 my $fh = new IO::File $self->{'tmp_file_name'}, "r";
289 my $fh = $uploaded_file->fh();
291 Returns an IO::File handle to read the uploaded file.
297 return $self->{'fh'};
305 Koha Development Team <http://koha-community.org/>
307 Galen Charlton <galen.charlton@liblime.com>