繁体   English   中英

通过PERL脚本下载文件

[英]Downloading a file through PERL script

我有下面的PERL脚本,该脚本试图下载包含该脚本输出的文件。

我遇到一个错误,上面写着:

无法在C:/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;

这不是使用strict编译的,并且由于您使用strict ,因此看来这不是您执行的代码。 您的$cgi对象从未定义,因此将在编译时停止脚本。 这行:

print $cgi->header(

应该是

print $q->header(

你也应该知道

-attachment => '$out_file');

表示attachment参数将不包含变量$out_file的值,而将包含变量的文字名称。 如果希望它包含变量的值,则需要删除引号或使用双引号。

更重要的是,您还应该知道脚本非常不安全。 您直接使用cgi对象中的值,而无需验证它们。 open语句和system语句都可以轻松地进行操作,以在系统上执行任意命令。 例如:

$out_file = "foo; rm -rf /";
system("Reads.pl -i $upload_dir/$file -n $length -o $out_file");

您可能希望阅读有关安全性文档 ,并可能使用异味模式-T开关)。

代替

print $cgi->header(

你可能是说

print $q->header(

使用use strict应该已经捕获了此错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM