develooper Front page | perl.libwww | Postings from February 2003

File Upload: Fh reference from browser

Thread Next
From:
Don Smitheimer
Date:
February 18, 2003 06:53
Subject:
File Upload: Fh reference from browser
Message ID:
000c01c2d75d$6df1f8e0$17e05243@donshome
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.

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About