NAME
Apache2::ASP::UploadHandler - Base class for Handlers that process file uploads
SYNOPSIS
Place the following code into /handlers/MyUploader.pm
:
package MyUploader;
use strict;
use base 'Apache2::ASP::UploadHandler';
# Override any methods we need to:
sub upload_end
{
my ($s, $Session, $Request, $Response, $Server, $Application, $Upload) = @_;
shift(@_);
$s->SUPER::upload_end( @_ );
$Response->Redirect("/index.asp?status=done");
}# end upload_end()
1;# return true:
Then, create a web pages with a form that uploads a file to /handlers/MyUploader
:
<html>
...
<form method="POST" enctype="multipart/form-data" action="/handlers/MyUploader">
<input type="file" name="filename">
<input type="submit" value="Click Here to Upload">
</form>
...
</html>
After the upload has finished, "MyUploader" will redirect you to /index.asp?status=done
(where you might display a message of some kind).
DESCRIPTION
This package provides the Apache2::ASP environment with the ability to process file uploads while they are happening. Through the use of libapreq2 we expose trigger points that will be called at specific times during a file upload.
OVERRIDABLE METHODS
upload_start( $self, $Session, $Request, $Response, $Server, $Application, $Upload )
Called just before upload_hook()
is called for the first time. If you need to do any kind of setup or double-checking, this is the time to do it.
upload_end( $self, $Session, $Request, $Response, $Server, $Application, $Upload )
Called just after upload_hook()
is called for the last time. If you need to do any kind of cleanup or redirect the user, this is the time to do it.
upload_hook( $self, $Session, $Request, $Response, $Server, $Application, $Upload )
Called each time Apache reads in a chunk of bytes from the client during the upload.
ARGUMENTS
All methods - upload_start()
, upload_end()
and upload_hook()
are called with the same arguments. They are listed here:
$Session
The global $Session
object. See Apache2::ASP::Session for details.
$Request
The global $Request
object. See Apache2::ASP::Request for details.
$Response
The global $Response
object. See Apache2::ASP::Response for details.
$Server
The global $Server
object. See Apache2::ASP::Server for details.
$Application
The global $Application
object. See Apache2::ASP::Application for details.
$Upload
The $Upload
argument is a hashref with the following structure:
$VAR1 = {
'upload' => APR::Request::Param object,
'content_length' => 5333399,
'percent_complete' => '99.99',
'data' => 'The data that was received by the server in this "chunk"',
'total_expected_time' => 3,
'elapsed_time' => '3.04842114448547',
'time_remaining' => 0,
'length_received' => 0,
};
In an attempt to explain this in more detail, each element is listed below:
upload
An APR::Request::Param object. Use this object to retrieve information about the uploaded file (i.e. filehandle, MIME type, etc).
content_length
The size of the entire HTTP request as specified by $ENV{CONTENT_LENGTH}
.
percent_complete
A float that indicates the percent of the upload we have received so far.
data
The string of bytes that was received from the client in the most recent chunk.
total_expected_time
Total number of seconds we expect this entire upload operation to take.
elapsed_time
Total number of seconds since we started this upload.
time_remaining
Total number of seconds remaining for this upload.
length_received
Total number of bytes we have received from the client at this point.
HOW TO SAVE UPLOADED FILE DATA
Of course the whole point of uploading files is to save them on the server.
Do it like this:
# Get our filehandle:
my $in_filehandle = $Upload->{upload}->upload_fh;
# Create a local file to write to:
open my $out_filehandle, '>', '/path/to/save/file';
# Make MSWin32 happy:
binmode($out_filehandle);
binmode($in_filehandle);
# Read from one filehandle and write to the other:
while( my $line = <$in_filehandle> )
{
print $out_filehandle $line;
}# end while()
# Finish up:
close($in_filehandle);
close($out_filehandle);
AUTHOR
John Drago jdrago_999@yahoo.com
COPYRIGHT AND LICENSE
Copyright 2007 John Drago, All rights reserved.
This software is free software. It may be used and distributed under the same terms as Perl itself.