stas 02/05/15 08:33:15 Modified: src/docs credits.pod src/docs/1.0/guide Changes.pod snippets.pod Log: new recipe: File Upload with Apache::Request Submitted by: Rich Bowen <[EMAIL PROTECTED]> Revision Changes Path 1.4 +2 -0 modperl-docs/src/docs/credits.pod Index: credits.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/credits.pod,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- credits.pod 13 May 2002 04:47:24 -0000 1.3 +++ credits.pod 15 May 2002 15:33:15 -0000 1.4 @@ -450,6 +450,8 @@ =item * Rex Staples +=item * Rich Bowen + =item * Richard A. Wells =item * Richard Chen 1.25 +4 -0 modperl-docs/src/docs/1.0/guide/Changes.pod Index: Changes.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/Changes.pod,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- Changes.pod 13 May 2002 07:16:37 -0000 1.24 +++ Changes.pod 15 May 2002 15:33:15 -0000 1.25 @@ -11,6 +11,10 @@ =head1 ??? ver 1.32 +* snippets.pod: + + o new recipe: File Upload with Apache::Request [Rich Bowen] + * cookbook o ported "Passing Arguments to a SSI script" from the modperl faq 1.10 +97 -0 modperl-docs/src/docs/1.0/guide/snippets.pod Index: snippets.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/snippets.pod,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- snippets.pod 12 May 2002 07:29:30 -0000 1.9 +++ snippets.pod 15 May 2002 15:33:15 -0000 1.10 @@ -7,6 +7,103 @@ A collection of mod_perl code snippets which you can either adapt to your own use or integrate directly into your own code. +=head1 File Upload with Apache::Request + +The C<Apache::Request> module gives you an easy way to get form +content, including uploaded files. In order to add file upload +functionality to your form, you need to add two things. + +First, you'll need to add a form field which is type I<file>. This +will put a C<browse> button on the form that will allow the user to +choose a file to upload. + +Second, you'll neet to make sure to add, to the C<form> tag the +following: + + enctype="multipart/form-data" + +You won't be able to upload a file unless you have added this to the +C<form> tag. + +In your code, you'll need to take a few extra steps to actually +retrieve that file that has been uploaded. Using the following +C<form()> method will allow you to have a standard function that +handles all of your forms, and does the right thing in the event that +there was a file uploaded. You can put this function in your +C<mod_perl> handler, or in whatever module you want. + + sub form { + use Apache::Request; + my $r = Apache->request(); + my $apr = Apache::Request->new($r); + my @keys = $apr->param; + + my %form; + foreach my $key(@keys) { + + my @value = $apr->param($key); + next unless scalar @value; + + if ( @value > 1 ) { + $form{$key} = [EMAIL PROTECTED]; + } else { + $form{$key} = $value[0]; + } + } + + my $upload = $apr->upload; + if ($upload) { + $form{UPLOAD} = $upload; + } + + return \%form; + } + +In your code, you can get the contents of the form by calling this +function: + + my $form = Your::Class::form(); # Wherever you put this function + +The value returned from this function is compatible with C<CGI.pm> and +other modules such as C<CGI::Lite> Which is to say, the function +returns a hashref. The keys of the hash are the names in your +form. The values in the hash are the values entered in those fields, +with the exception that a multiple select list with multiple things +selected will return a listref of the selected values. + +I<If> your form contained a file upload element, then C<$form{UPLOAD}> +will contain a file upload object, which you can make calls back into. + +For example: + + my $form = Your::Class::form(); # Wherever you put this function + if (my $file = $form->{UPLOAD}) { + my $filename = $file->filename; # If you need the name + + # And, if you want to save the file at $filelocation ... + open F, ">$filelocation"; + my $filehandle = $file->fh; + while (my $d = <$filehandle>) { + print F $d; + } + close F; + } + +That should give you the general idea of how this works. This lets you +have a generic form handler that does "normal" forms as well as file +upload forms, in mod_perl, without having to mess with C<CGI.pm>, and +without having to do custom things when you have a file upload. + +You will need to see the documentation for C<Apache::Upload> for more +information about how to deal with the file upload object once you +have it. Note that the C<Apache::Upload> docs are embeded in the +C<Apache::Request> documentation, so you'll need to look there for +that information. + +=cut + + + =head1 Redirecting Errors to the Client Instead of error_log Many error conditions result in an I<exception> (or I<signal> -- same
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]