在未打开的文件句柄上使用perl" read()进行文件上传时出错#34;

时间:2015-02-20 09:49:59

标签: perl cgi

当我使用perl上传文件时,我正面临读取文件错误

           fileparse_set_fstype('MSWin32');
            my ($OriginalName,$OriginalPath) = fileparse( $CgiRef->{'filename'} );
            my $LocalName = $_ . $OriginalName;

            open(FILE, ">$config->{'BASE_PATH'}/files/$LocalName")
               or die "Could not open file:$!";
            my $Req = new CGI;
            while (read($Req->param('filename'), my $Buffer, 1024))
            {
               print FILE $Buffer;
            }
        close(FILE)

访问$CgiRef->{'$filename'}或任何引用变量没有问题。 请告诉我上传时的实际问题在哪里。 现在它显示错误 未打开的文件句柄上的read()

1 个答案:

答案 0 :(得分:0)

你试图从错误的地方读书。在CGI-land中,使用$cgi->upload('varname')在您尝试接收的对象上获取文件句柄。

您的代码段的修改版本应该有效:

 fileparse_set_fstype('MSWin32');

 my ($OriginalName,$OriginalPath) = fileparse( $CgiRef->{'filename'} );
 my $LocalName = $_ . $OriginalName;

 open(FILE, ">", "$config->{'BASE_PATH'}/files/$LocalName")
     or die "Could not open file:$!";

 my $Req = CGI->new();

 # Get the filehandle for the upload content
 my $Req_file = $Req->upload('filename');

 # Save to FILE
 while (<$Req_file>) {
     print FILE;
 }
 close(FILE);

请注意,请始终使用open的3个参数版本。它更干净,更安全,更清晰。有关说明,请参阅Modern Perl

可以找到从HTML表单到CGI处理的整个过程的完整示例here