使用 perl 上传文件时出错 "read() on unopened filehandle"
Error in file upload using perl "read() on unopened filehandle"
我在像这样使用 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()
您试图从错误的地方读取。在 CGI 领域,使用 $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。
我在像这样使用 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()
您试图从错误的地方读取。在 CGI 领域,使用 $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。