【问题标题】:Downloading a file through PERL script通过 PERL 脚本下载文件
【发布时间】:2012-10-08 17:51:20
【问题描述】:

我有以下 PERL 脚本,它尝试下载包含该脚本输出的文件。

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

无法在 C:/Apache24/cgi-bin/trim.pl 中的未定义值上调用方法“header”

但是,我的输出文件在正确的目的地正确写入。请帮助我修复代码并下载输出文件。

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;

【问题讨论】:

    标签: perl


    【解决方案1】:

    这不能用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");
    

    您可能希望阅读documentation on security,并可能使用taint mode-T 开关)。

    【讨论】:

    • 我已经调整了我的脚本如下。由于我是 PERL 新手,所以我不了解文档安全概念。打开 ( DOWNLOADFILE, "header( -type => 'application/octet-stream' -attachment => "$out_file");关闭下载文件;这次脚本运行成功,但 out_file 无法下载。请你帮我解决这个问题。
    【解决方案2】:

    代替

    print $cgi->header(
    

    你可能是说

    print $q->header(
    

    使用use strict 应该会发现这个错误。

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      相关资源
      最近更新 更多