如何使用perl处理多个上传?

时间:2014-09-05 16:07:12

标签: perl file-upload cgi multifile-uploader file-processing

从1天开始,我就被震惊了。 首先是取所有文件名。然后上传并收集所有文件句柄。 由于某种原因,文件无法正确上传到/ home / img文件夹。 如果上传,它们就会被破坏。损坏的文件大小显示为0字节或24字节。

请提供上传部分的帮助。

#!/usr/bin/perlml -Tw

use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my $cgi = CGI->new;

my $upload_dir = "/home/img";

my @raw_filenames       = $cgi->param('photos');
my $filename_characters = 'a-zA-Z0-9_.-';
my $ext                 = "";

my $raw_filenames = "";
my $raw_fh        = "";

my $single_filename  = "";
my $single_io_handle = "";

my @all_io_handle = "";
my @all_filenames = "";

print "Content-type: text/html\n\n";

#Getting the filenames ready
foreach $raw_filenames (@raw_filenames) {
    ( $single_filename, undef, $ext ) = fileparse( $raw_filenames, qr{\..*} );
    push( @all_filenames, "$single_filename" );
}

#This prints the ready list of filenames
print "@all_filenames\n <br>";

#Getting the filehandles ready
my @raw_fh = $cgi->upload('photos');

foreach $raw_fh (@raw_fh) {
    $single_io_handle = $raw_fh->handle;
    push( @all_io_handle, "$single_io_handle" );
}

#This prints the ready list of filehandles
print "@all_io_handle\n <br>";

1 个答案:

答案 0 :(得分:0)

CGI->upload的以下测试适用于html input multiple属性。

我尝试通过临时文件和从磁盘读取文件来查看每个上传文件的文件大小:

#!/usr/bin/env perl
use strict;
use warnings;

use CGI;
use CGI::Carp qw(fatalsToBrowser);

my $q = CGI->new();

my $msg = '';
if ( $q->request_method() eq 'POST' ) {
    $msg .= '<table border=1 cellpadding=3 cellspacing=0><tr><th>File name</th><th>Temp size</th><th>Slurped size</th></tr>';
    for my $file ( $q->upload('myfile') ) {
        my $tempsize = -s $q->tmpFileName($file);
        my $readsize = do {
            my $fh = $file->handle();
            binmode $fh;
            local $/;    # Slurp entire file
            length <$fh>;
        };
        $msg .= '<tr><td>' . $q->escapeHTML($file) . "</td><td>$tempsize</td><td>$readsize</td></tr>";
    }
    $msg .= '</table>';
}

print $q->header;

print <<"END_HTML";
<html>
<head>
<title>Upload form using CGI</title>
</head>
<body>
<h1>Upload form using CGI</h1>
$msg
@{[ $q->start_form() ]}
<p><input type="file" name="myfile" accept="image/gif,image/jpeg,image/png" multiple required /></p>
<p><input type="submit" value="Upload"></p>
@{[ $q->end_form() ]}
</body>
</html>
END_HTML

发布前

  

Before Post

发布3张图片后

  

After Post

您可能很简单地拥有CGI的过时版本。检查版本

$ perl -MCGI -E 'say $CGI::VERSION'
4.04