我正在尝试将文件上传添加到现有网页。
每次上传时,我都会收到一个已损坏的文件。
我确保在文件句柄上设置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;
}
答案 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)。
至少有几种解决方法:
使用明确的readline
电话:
while (readline($article{upload_file}))
将文件句柄指定给一个简单的标量
my $upload_fh = $article{upload_file};
...
while (<$upload_fh>)