使用Perl CGI进行多个文件上载

时间:2017-03-13 19:51:36

标签: perl cgi

我有一个简单的网络表单,我希望用户选择要上传的文件夹(我只关心文件夹的内容)。所以我尝试做这项工作如下:

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use Data::Dumper;

my $q = CGI->new();
print $q->header;

my $upload_folder = '/var/www/html/uploads';
my $name = $q->param('name');
my $email = $q->param('email');
my $comments = $q->param('comments');
my @files = $q->param('multi_files');

foreach my $upload(@files){
    print "Upload this please -- $upload<br>";
    my $upload_file  = $q->upload($upload);
    if ($upload_file){
        open (OUTFILE,">$upload_folder/$upload") or die $!;;
        binmode OUTFILE;
        while (<$upload_file>) {
            print OUTFILE;
        }
    }
    else {
        print "<b>Guess it's broken</b><br/>";
    }
}

print "<p><b>Name</b> -- $name<br><b>Email</b> -- $email<br><b>Comments</b> -- $comments<br>";

print $q->end_html;

当我运行脚本时,所有参数都是正确的,文件按预期打印出来,但是当我执行上传查询时,它返回空白。这是我第一次尝试使用CGI,因为我倾向于使用其他语言来处理表单。

以下是表单中的代码:

<html>
    <head>
        <title>Stupid Test Site</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" ></script>
    </head>
    <body>
        <h1>This is a test</h1>

        <form action="/cgi-enabled/test.pl" method="POST">
            Your Name: <input type="text" name="name"><br>
            Email Address: <input type="text" name="email"><br>
            Select PO folder: <input name="multi_files" type="file" webkitdirectory multiple /><br/>
            Comments:<br>
            <textarea name="comments" rows="5" cols="60"></textarea><br>
            <input type="submit" value="Send">
        </form>
    </body>
</html>

我也在perlmonks.com上发布了这个问题。

1 个答案:

答案 0 :(得分:0)

我的代码的主要问题是它缺少

  

是enctype =&#34;多部分/格式数据&#34;

从表格中。我也做了一些改变。这是我的工作代码。

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use Data::Dumper;
use CGI::Carp qw( fatalsToBrowser );
use HTML::Entities qw/encode_entities/;
use File::Copy qw' copy ';
use File::Basename;

my $q = new CGI;
print $q->header;

my $upload_folder = '/var/www/html/uploads';

my $name = $q->param('name');
my $email = $q->param('email');

my $comments = $q->param('comments');
my @files = $q->param('multi_files');
my @io_handles=$q->upload('multi_files');

my %file_hash;

foreach my $item(@files){
    next unless $item =~ /.+\/(M.+\.pdf)/;
    foreach my $sub_item(@io_handles){
        if($item eq $sub_item){
            $file_hash{$item} = $sub_item;
        }
    }
}

chdir $upload_folder or die "Cannot chdir to upload destination directory: $!\n";

print '<ul>';
foreach my $key(keys %file_hash){
    my $base = basename($file_hash{$key});#    
    my $tmpfilename = $q->tmpFileName($file_hash{$key});
    my $destFile = File::Spec->catfile($upload_folder,$base);
    copy( $tmpfilename, $destFile ) or die "Copy to ($destFile) failed: $!\n";
    print '<li>Sucessfully uploaded --- <b>', CGI->escapeHTML(basename($key)), '</b></li>';
}
print '</ul>';

print "<p><b>Name</b> -- $name<br><b>Email</b> -- $email<br><b>Comments</b> -- $comments<br>";

print $q->end_html;

感谢您的帮助。 (我也在perlmonks.com上发布了这个答案)