2011-11-03 33 views
1

我正在嘗試編寫一個Perl CGI腳本,用於將客戶端計算機上傳的文件保存到服務器上的文件中。在客戶端,C#代碼使用httpWebRequest並通過流發送數據。如何處理由C#httpWebRequest上傳的文件使用服務器端的Perl CGI腳本?

上傳數據似乎沒有與它相關的參數,所以我很難閱讀它(我不知道C#)。在搜索#1這裏後,我設法使用捕獲數據,

$query = CGI->new(); 
$data = $query->param('POSTDATA'); 

我現在可以直接把這些數據寫入到文件中,

open (FH, ">$filename") or die ("error opening file $filename: $!"); 
print FH $data; 
close FH; 

這正常爲小大小的文件。但是,當POSTDATA包含大小超過500MB的大數據時,Perl CGI腳本會一直等到所有文件被下載並寫入文件。看來POSTDATA包含整個文件。這會對系統內存造成壓力。是否有任何其他方式來讀取httpWebrequest流數據並將其寫入文件?

回答

1

模塊不可能使用CGI模塊。另外,我不知道有任何Perl CGI實現爲您提供POST數據的流式處理。

考慮切換到PSGI。 body method in Plack::Request給你一個文件句柄來讀取。


實施例的應用程序(未測試):

plackup -MIO::File::WithPath -MPlack::Request -MSys::Sendfile=sendfile -e ' 
    my $app = sub { 
     my ($env) = @_; 
     my $out = IO::File::WithPath->new("/tmp/out", "w") or die $!; 
     my $req = Plack::Request->new($env); 
     my $r = sendfile($out, $req->body) or die $!; 
     return [200, [], []] 
    } 
' 

lwp-request -m POST -c text/plain -USe http://localhost:5000 < /usr/src/linux/COPYING 
+0

感謝您的reply.I'll儘快嘗試。 –

相關問題