网页文件上传始终已损坏

时间:2017-01-09 15:59:32

标签: perl file-upload cgi filehandle

我正在尝试将文件上传添加到现有网页。

每次上传时,我都会收到一个已损坏的文件。

我确保在文件句柄上设置binmode。我的输入 enctype 也在我的表单中设置为multipart/formdata

我的代码如下

$article{upload_file_name} = $cgi->param( 'upFile' );
$article{upload_file}      = $cgi->upload( 'upFile' );

if ( $article{upload_file_name} ne "" or $article{upload_file_name} ne null ) {

    open( UPLOADS, ">$uploads_dir/$article{upload_file_name}" )
            or die "Could not open $uploads_dir/$article{upload_file_name}";

    binmode UPLOADS;

    while ( <$article{upload_file}> ) {
        print UPLOADS;
    }

    close UPLOADS;
}

我也试过这个

$article{upload_file} = $cgi->param( 'upFile' );

if ( $article{upload_file} ne "" or $article{upload_file} ne null ) {

    open( UPLOADS, ">$uploads_dir/$article{upload_file}" )
            or die "Could not open $uploads_dir/$article{upload_file}";
    binmode UPLOADS;

    while ( <$article{upload_file}> ) {
        print UPLOADS;
    }

    close UPLOADS;
}

1 个答案:

答案 0 :(得分:1)

<$article{upload_file}>

没有做你认为它正在做的事情。钻石运算符(<>)用于代表Perl的readline函数,但它具有第二个含义,它与Perl的{{3}相同。功能。在Perl的解析规则中,<$hash{key}>始终被视为glob

glob解释说:

  

如果尖括号内的内容既不是文件句柄也不是包含文件句柄名称,typeglob或typeglob引用的简单标量变量,则它被解释为要进行全局化的文件名模式,以及文件名列表或者返回列表中的下一个文件名,具体取决于上下文。这种区别仅仅是出于句法原因而确定的。这意味着&lt; $ x&gt;始终是来自间接句柄的readline(),但&lt; $ hash {key}&gt;总是一个glob()。这是因为$ x是一个简单的标量变量,但$ hash {key}不是 - 它是一个哈希元素。甚至&lt; $ x&gt; (注意额外的空格)被视为glob(&#34; $ x&#34;),而不是readline($ x)。

至少有几种解决方法:

  1. 使用明确的readline电话:

    while (readline($article{upload_file}))
    
  2. 将文件句柄指定给一个简单的标量

    my $upload_fh = $article{upload_file};
    ...
    while (<$upload_fh>)