网页文件上传总是损坏的



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

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

我确保在文件句柄上设置了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;
}
<$article{upload_file}>

不是在做你认为它正在做的事情。菱形运算符(<>)用来代替Perl的readline函数,但它还有第二层含义,它做的事情与Perl的glob函数相同。在Perl的解析规则中,<$hash{key}>总是被视为glob

perldoc -f perlop解释:

如果尖括号内的既不是文件句柄,也不是包含文件句柄名称、typeglob或typeglb引用的简单标量变量,则它被解释为要进行globed的文件名模式,并根据上下文返回文件名列表或列表中的下一个文件名。这种区别仅基于句法原因。这意味着<x>始终是来自间接句柄的readline(),但是<hash{key}>总是一个glob()。这是因为$x是一个简单的标量变量,但$hash{key}不是——它是一个散列元素。甚至<x>(注意额外的空格)被视为glob("$x"),而不是readline($x)。

至少有几个解决方案:

  1. 使用显式readline调用:

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

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

最新更新