Perl script for file upload

前端 未结 3 1514
死守一世寂寞
死守一世寂寞 2021-01-21 14:48

I am trying to write a script in Perl that will allow the user to upload a file. At the moment, it says that it is working, but it does not actually upload the file!

Her

相关标签:
3条回答
  • 2021-01-21 14:59

    CGI, besides lots of documentation, also comes with a lot of examples, see http://search.cpan.org/dist/CGI/MANIFEST

    So combined with that knowledge, you can write

    #!/usr/bin/perl --
    use constant DEBUG => !!( 0 || $ENV{PERL_DEBUG_MYAPPNAME} );
    use CGI;
    use CGI::Carp qw( fatalsToBrowser );
    
    # to avoid those pesky 500 errors
    BEGIN {
        CGI::Carp::set_message(
            sub {
                print "<h1>Oooh I got an error, thats not good :)</h1>\n";
                if (DEBUG) {
                    print '<p>', CGI->escapeHTML(@_), '</p>';
                }
            }
        );
    } ## end BEGIN
    
    
    use strict;
    use warnings;
    use Data::Dumper ();
    use File::Copy qw' copy ';
    
    Main( @ARGV );
    exit( 0 );
    
    sub Main {
    
    #~     return DebugCGI(); # generic, env.cgi
        return SaveUploadsTo(
            CGI->new,
            [qw' file otheruploadfile andAnother '],
            '/destination/dir/where/uploads/end/up', 
        );
    } ## end sub Main
    
    
    sub SaveUploadsTo {
        my( $cgi,  $uploadFields , $destDir ) = @_;
        chdir $destDir
          or die "Cannot chdir to upload destination directory: $!\n";
        print $cgi->header;
        for my $field ( @{ $uploadFields } ){
            my $filename = $cgi->param( $field );
            my $tmpfilename = $cgi->tmpFileName( $filename );
            $filename = WashFilename( $filename ) ;
    
            my $destFile = File::Spec->catfile( $destDir, $filename );
    
            copy( $tmpfilename, $destFile )
              or die "Copy to ( $destFile ) failed: (( $! ))(( $^E ))";
    
            print "<p>Sucessfully uploaded  ",
                CGI->escapeHTML( $filename  ),
                " thanks</p>\n";
        }
        print "<P>done processing uploads</p>\n";
    } ## end sub SaveUploadsTo
    
    sub DebugCGI {
        my $cgi = CGI->new;
        print $cgi->header();    # Write HTTP header
        print $cgi->start_html,
          $cgi->b( rand time, ' ', scalar gmtime ),
          '<table border="1" width="%100"><tr><td>',
          $cgi->Dump,
          '</td>',
          '<td><div style="white-space: pre-wrap; overflow: scroll;">',
          $cgi->escapeHTML( DD($cgi) ),
          '</div></td></tr></table>',
          CGI->new( \%ENV )->Dump,
          $cgi->end_html;
    } ## end sub DebugCGI
    
    
    sub WashFilename {
        use File::Basename;
        my $basename = basename( shift );
        # untainted , only use a-z A-Z 0-9 and dot
        $basename = join '', $basename =~ m/([.a-zA-Z0-9])/g;
        # basename is now, hopefully, file.ext
        ## so to ensure uniqueness, we adulterate it :)
        my $id = $$.'-'.time;
        my( $file, $ext ) = split /\./, $basename, 2 ;
        return join '.', grep defined, $file, $id, $ext;
    } ## end sub WashFilename
    
    sub DD { scalar Data::Dumper->new( \@_ )->Indent(1)->Useqq(1)->Dump; }
    

    Your code shrinks when you switch to Dancer/Catalyst/Mojolicious

    0 讨论(0)
  • 2021-01-21 15:19

    You can use this code, will work properly.

    #!/usr/bin/perl
     use CGI;
     my $cgi = new CGI;
     my $dir = 'sub';
     my $file = $cgi->param('file');
     $file=~m/^.*(\\|\/)(.*)/;
     # strip the remote path and keep the filename
     my $name = $2;
     open(LOCAL, ">$dir/$name") or print 'error';
     my $file_handle = $cgi->upload('file');     // get the handle, not just the filename
    binmode LOCAL;
     while(<$file_handle>) {               // use that handle
        print LOCAL;
     }
     close($file_handle);                        // clean the mess
     close(LOCAL);                               // 
     print $cgi->header();
     print $dir/$name;
     print "$file has been successfully uploaded... thank you.\n";enter code here
    
    0 讨论(0)
  • 2021-01-21 15:23

    As CanSpice pointed out, this question gives the answer:

     #!/usr/bin/perl
     use CGI;
     my $cgi = new CGI;
     my $dir = 'sub';
     my $file = $cgi->param('file');
     $file=~m/^.*(\\|\/)(.*)/;
     # strip the remote path and keep the filename
     my $name = $2;
     open(LOCAL, ">$dir/$name") or print 'error';
     my $file_handle = $cgi->upload('file');     // get the handle, not just the filename
     while(<$file_handle>) {               // use that handle
        print LOCAL $_;
     }
     close($file_handle);                        // clean the mess
     close(LOCAL);                               // 
     print $cgi->header();
     print $dir/$name;
     print "$file has been successfully uploaded... thank you.\n";enter code here
    
    0 讨论(0)
提交回复
热议问题