(BUG #4521) aqbudgets.pl - Transform undefined budget spent value to 0.00 value
[koha.git] / C4 / UploadedFile.pm
blob332993620937a9e13e468c44b908b40711473005
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
11 # version.
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.
21 use strict;
22 #use warnings; FIXME - Bug 2505
23 use C4::Context;
24 use C4::Auth qw/get_session/;
25 use IO::File;
27 use vars qw($VERSION);
29 BEGIN {
30 # set the version for version checking
31 $VERSION = 3.00;
34 =head1 NAME
36 C4::UploadedFile - manage files uploaded by the user
37 for later processing.
39 =head1 SYNOPSIS
41 =over 4
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();
60 =back
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.
71 =cut
73 =head1 METHODS
75 =cut
77 =head2 new
79 =over 4
81 my $uploaded_file = C4::UploadedFile->new($sessionID);
83 =back
85 Creates a new object to represent the uploaded file. Requires
86 the current session ID.
88 =cut
90 sub new {
91 my $class = shift;
92 my $sessionID = shift;
94 my $self = {};
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";
101 mkdir $OUTPUTDIR;
102 my $tmp_file_name = "$OUTPUTDIR/$self->{'fileID'}";
103 my $fh = new IO::File $tmp_file_name, "w";
104 unless (defined $fh) {
105 return undef;
107 $fh->binmode(); # Windows compatibility
108 $self->{'fh'} = $fh;
109 $self->{'tmp_file_name'} = $tmp_file_name;
110 $self->{'max_size'} = 0;
111 $self->{'progress'} = 0;
112 $self->{'name'} = '';
114 bless $self, $class;
115 $self->_serialize();
117 my $session = get_session($sessionID);
118 $session->param('current_upload', $self->{'fileID'});
119 $session->flush();
121 return $self;
125 sub _serialize {
126 my $self = shift;
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);
135 $session->flush();
136 $self->{'fh'} =$fh;
139 =head2 id
141 =over 4
143 my $fileID = $uploaded_file->id();
145 =back
147 =cut
149 sub id {
150 my $self = shift;
151 return $self->{'fileID'};
154 =head2 name
156 =over 4
158 my $name = $uploaded_file->name();
159 $uploaded_file->name($name);
161 =back
163 Accessor method for the name by which the file is to be known.
165 =cut
167 sub name {
168 my $self = shift;
169 if (@_) {
170 $self->{'name'} = shift;
171 $self->_serialize();
172 } else {
173 return $self->{'name'};
177 =head2 max_size
179 =over 4
181 my $max_size = $uploaded_file->max_size();
182 $uploaded_file->max_size($max_size);
184 =back
186 Accessor method for the maximum size of the uploaded file.
188 =cut
190 sub max_size {
191 my $self = shift;
192 @_ ? $self->{'max_size'} = shift : $self->{'max_size'};
195 =head2 stash
197 =over 4
199 $uploaded_file->stash($dataref, $bytes_read);
201 =back
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.
206 =cut
208 sub stash {
209 my $self = shift;
210 my $dataref = shift;
211 my $bytes_read = shift;
213 my $fh = $self->{'fh'};
214 print $fh $$dataref;
216 my $percentage = int(($bytes_read / $self->{'max_size'}) * 100);
217 if ($percentage > $self->{'progress'}) {
218 $self->{'progress'} = $percentage;
219 $self->_serialize();
223 =head2 done
225 =over 4
227 $uploaded_file->done();
229 =back
231 Indicates that all of the bytes have been uploaded.
233 =cut
235 sub done {
236 my $self = shift;
237 $self->{'progress'} = 'done';
238 $self->{'fh'}->close();
239 $self->_serialize();
242 =head2 upload_progress
244 =over 4
246 my $upload_progress = C4::UploadFile->upload_progress($sessionID);
248 =back
250 Returns (as an integer from 0 to 100) the percentage
251 progress of the current file upload.
253 =cut
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;
269 } else {
270 $reported_progress = $progress;
274 return $reported_progress;
277 =head2 fetch
279 =over 4
281 my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
283 =back
285 Retrieves an uploaded file object from the current session.
287 =cut
289 sub fetch {
290 my $class = shift;
291 my $sessionID = shift;
292 my $fileID = 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";
298 $self->{'fh'} = $fh;
300 bless $self, $class;
301 return $self;
304 =head2 fh
306 =over
308 my $fh = $uploaded_file->fh();
310 =back
312 Returns an IO::File handle to read the uploaded file.
314 =cut
316 sub fh {
317 my $self = shift;
318 return $self->{'fh'};
322 __END__
324 =head1 AUTHOR
326 Koha Development Team <info@koha.org>
328 Galen Charlton <galen.charlton@liblime.com>
330 =cut