【问题标题】:how to process multiple uploads using perl?如何使用 perl 处理多个上传?
【发布时间】:2014-10-30 15:33:24
【问题描述】:

自从 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>";

【问题讨论】:

  • 调试时间:你能创建一个表单来成功上传单个文件吗?先确认一下。然后看看您是否可以创建一个具有多个具有唯一名称的上传字段的表单。确认有效。最后,为所有上传字段命名,就像您在此处尝试的那样。这可能会将问题隔离到更小的范围内,因此有助于确定问题。
  • 我对@9​​87654322@ 上传一无所知,但想知道你为什么不使用一些更高级别和更现代的框架,例如:Poet、Mojolicious、Dancer 等等......很多事情都简单得多,更容易和更快地开发-部署...
  • @Miller - 是的。我可以使用 code
    创建一个带有输入多个属性的表单。
  • 这些天来,CGI 模块看起来相当长。查看 CPAN 上的 CGI::Alternatives 以查看更现代(更简单!)的方法来完成您尝试在此处使用 cgi 完成的工作。
  • @Miller 我会尝试使用你说的方法。我会再回来的。

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


【解决方案1】:

CGI-&gt;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

发帖前

发布 3 张图片后

您可能只是拥有一个过时的CGI 版本。检查版本

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

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2014-04-09
    • 2012-02-02
    相关资源
    最近更新 更多