am sorry to have bothered y'all with my first posting. After looking again, for the
nth time, at the man pages, books, and my code, I finally saw what my problem was.
Content type is specified as 'form-data' not 'form_data' as I had done. Once I fixed
that everything worked and the files uploaded as reference type of Fh.
Thank you Mr. Tillman for your response.
Don
----- Original Message -----
From: Don Smitheimer <[EMAIL PROTECTED]>
Date: Tuesday, February 18, 2003 9:52 am
Subject: File Upload: Fh reference from browser
> Hi All,
>
> I am using Perl v5.6.1, LWP v5.65.
>
> My original problem started when I tried to create a LWP program
> to upload files to a CGI application package--to automate tasks
> performed by cumbersome and tedious browser interfaces I must do
> during my adminstration duties with this application.
>
> I looked at the Perl source code and noticed they first check for
> a Fh reference of the uploaded file, otherwise the upload is not
> successful. I coded up my LWP program--my first time using the
> upload capability of LWP--but was not successful. So I decided to
> modify their code slightly to dump the request data. I noticed
> then that in fact when using a browser the request shows some kind
> of Fh reference (in fact, something like this: 'File1' => [bless(
> \*{'Fh::fh00001C%3A\\My Documents\\whatever.txt'}, 'Fh' ) ). But
> that's not what I see when using LWP.
>
> So I coded up a simple upload CGI app and upload program to get
> things working at a simple level. But I have not been successful
> with that either. The upload CGI app works with a browser, and
> the data dump shows a Fh ref, but it doesn't work with the LWP
> program.
> So now I have two problems: a) I can't figure out how to automate
> my task via LWP and, b) I can't get my simple LWP to upload a file.
>
> I have read in the docs (man pages and LWP book) that LWP includes
> the contents of the file in the HTTP response. Is that what a
> browser does? If so, where does the ref to Fh come from? If I am
> doing something wrong with the LWP code, I'd appreciate pointing
> it out. If my code is functionally correct, then how do I convince
> the original CGI app that it has received an Fh reference? (it's
> not practical, and it is illegal, for me to modify the source code
> of the orignal CGI app).
>
> Any help in this is greatly appreciated.
>
> I have included the source and output from my simple upload
> functions below for your reference.
>
> Thanks much,
>
> Don Smitheimer
>
>
> ======Simple upload CGI app=======
> #!/usr/local/bin/perl
>
> use CGI;
> use Data::Dumper;
>
> my $q = new CGI();
>
> my $form = qq|
> <P>Enter Filename:</P>
> <FORM ENCTYPE="multipart/form-data" METHOD="POST"
> ACTION="upload.cgi"> <INPUT TYPE="FILE"
> NAME="File1"> <INPUT TYPE="SUBMIT" NAME="Subm
> it1"> </FORM> |;
>
> open LOG, ">>/usr/local/bb/log/upload.log";
>
> $Method = $q->request_method();
>
> print $q->header();
>
> print $q->start_html;
>
> if ( $Method eq 'POST') {
> print LOG "\n";
>
> print LOG "==================In POST Method ------------------\n";
> print LOG Dumper($q);
> print LOG "\n";
> $fh = $q->param('File1'); # Is this supposed to be a
> filehandle or the string? I thought string but with browser it's Fh.
> print LOG "\$fh = $fh\n";
> print LOG Dumper($fh);
>
> my $buffer;
> my $bytesread = 0;
> open (OUTFILE,">>/usr/local/bb/log/uploaded.file") || die
> "can't open file $!";
> while ($bytesread=read($fh,$buffer,1024)) {
> print LOG "bytesread = $bytesread\n";
> print OUTFILE $buffer;
> }
> close OUTFILE;
> } else {
> print LOG "\n";
>
> print LOG "==================In NOT POST Method ------------------\n";
> print LOG Dumper($q);
> print LOG "\n";
> print $form;
> }
> close LOG;
> -------------------------------------------------------------------
> -----------
>
> =========Simple upload LWP program==========
> #!/usr/local/bin/perl
> # upload.pl
> # Don L. Smitheimer
> # Jan 31, 2003
>
> use strict;
> use LWP::UserAgent;
> use LWP::Debug qw(+);
> use Data::Dumper;
>
> my $TRUE = (1 == 1);
> my $FALSE = ! $TRUE;
> my $Host = "server";
> my $Today;
> my $PathToOutput = "./";
>
> my $logfile = "./upload.log";
>
> my $True = ( 1 == 1 );
> my $False = ! $True;
>
> my $HostURL = $Host . "some server somewhere";
> my $URI = "http://$HostURL";
> my $Response;
> my $ua;
> my $Code; # Response code from server
> my $File = "/usr/local/bb/pgms/bbupload/batchcreate.txt";
>
> $ua = LWP::UserAgent->new;
>
> $Response = $ua->post("$URI/upload.cgi",
> [ 'File1' => [$File],
> ],
> 'Content_Type' => 'form_data'
> );
>
> open LOG, ">>$logfile";
> print LOG Dumper($Response);
> close LOG;
> ------------------------------------------------------------
>
> =====Output of CGI app from browser=====
> ==================In NOT POST Method ------------------
> $VAR1 = bless( {
> '.header_printed' => '1',
> '.charset' => 'ISO-8859-1',
> '.parameters' => [],
> '.fieldnames' => {}
> }, 'CGI' );
>
>
> ==================In POST Method ------------------
> $VAR1 = bless( {
> '.tmpfiles' => {
> '3' => {
> 'info' => {
> 'Content-
> Disposition' => 'form-data; name="File1";
> filename="E:\\perl_code\\test.txt"',
> 'Content-Type' => 'text/plain'
> },
> 'name' => bless(
> do{\(my $o = '/usr/tmp/CGItemp63197')}, 'TempFile' )
> }
> },
> '.header_printed' => '1',
> '.charset' => 'ISO-8859-1',
> 'Submit1' => [
> 'Submit Query'
> ],
> '.parameters' => [
> 'File1',
> 'Submit1'
> ],
> '.fieldnames' => {},
> 'File1' => [
> bless(
> \*{'Fh::fh00001E%3A\\perl_code\\test.txt'}, 'Fh' )
> ]
> }, 'CGI' );
>
> $fh = E:\perl_code\test.txt
> $VAR1 = bless( \*{'Fh::fh00001E%3A\\perl_code\\test.txt'}, 'Fh' );
> bytesread = 16
> --------------------------------------------------------------
>
> =====Output of CGI app from LWP program=====
> ==================In POST Method ------------------
> $VAR1 = bless( {
> '.header_printed' => '1',
> '.charset' => 'ISO-8859-1',
> '.parameters' => [
> 'File1'
> ],
> '.fieldnames' => {},
> 'File1' => [
>
> '/usr/local/bb/pgms/bbupload/batchcreate.txt'
> ]
> }, 'CGI' );
>
> $fh = /usr/local/bb/pgms/bbupload/batchcreate.txt
> $VAR1 = '/usr/local/bb/pgms/bbupload/batchcreate.txt';
> ---------------------------------------------------------
>
> Hope this helps.
>