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.