我有下面的PERL脚本,它试图下载包含该脚本输出的文件。
我遇到一个错误,上面写着:
无法在C上的未定义值上调用方法“header”:/Apache24/cgi-bin/trim.pl
但是我的输出文件在正确的目的地正确写入。请帮我修复代码并下载输出文件。
use strict;
use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use File::Basename;
my $q = new CGI;
my $upload_dir = "C:/Apache24/htdocs/files" ;
my ($bytesread, $buffer);
my $numbytes = 1024;
my $trim_out_dir = "C:/Users/Admin/Desktop/vijay/Metagenomics/NGSQCToolkit_v2.3/CGI_Out";
my $out_file = "$trim_out_dir/trimmed.fasta";
my $safe_filename_characters = "a-zA-Z0-9_.-";
$q->cgi_error and error( $q, "Error transferring file: " . $q->cgi_error );
my $file = $q->param( "seq" ) || error( $q, "No file received." );
my $length = $q->param( "len");
my $quality = $q->param( "qual");
open ( UPLOADFILE, ">$upload_dir/$file" ) or die "$!";
while ($bytesread = read($file, $buffer, $numbytes)) {
print UPLOADFILE $buffer;
}
close UPLOADFILE;
system("Reads.pl -i $upload_dir/$file -n $length -o $out_file");
open ( DOWNLOADFILE, "<$out_file" ) or die "$!";
print $cgi->header(
-type => 'application/octet-stream'
-attachment => '$out_file');
close DOWNLOADFILE;
答案 0 :(得分:3)
这不会使用strict
进行编译,因为您使用的是strict
,所以这似乎不太可能是您执行的代码。永远不会定义$cgi
对象,因此会在编译时停止脚本。这一行:
print $cgi->header(
应该是
print $q->header(
你也应该知道
-attachment => '$out_file');
意味着attachment
param不包含变量$out_file
的值,它将包含变量的文字名称。如果您希望它包含变量的值,您需要删除引号,或使用双引号。
更重要的是,您还应该知道您的脚本非常不安全。您正在使用直接来自cgi对象的值而不验证它们。 open
语句和system
语句都可以轻松操作,以在您的系统上执行任意命令。例如:
$out_file = "foo; rm -rf /";
system("Reads.pl -i $upload_dir/$file -n $length -o $out_file");
您可能希望阅读documentation on security,也许可以使用taint mode(-T
切换)。
答案 1 :(得分:0)
而不是
print $cgi->header(
你可能意味着
print $q->header(
使用use strict
应该会发现此错误。