2012-10-08 108 views
0

我有下面的PERL腳本試圖下載包含該腳本輸出的文件。通過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; 

回答

0

而不是

print $cgi->header(

你大概的意思

print $q->header(

使用use strict應該抓住這個錯誤。

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開關)。

+0

我已經調整了我的腳本如下。由於我是PERL的新手,我不瞭解文檔安全概念。 open(DOWNLOADFILE,「<$ out_file」)或死「$!」; print $ q-> header( -type =>'application/octet-stream' -attachment =>「$ out_file」); 關閉DOWNLOADFILE; 這次腳本運行成功,但out_file不可用於下載。請你幫我解決這個問題。 – Vijay