2010-06-17 16 views
0

在windows服務器上使用perl 5.8.8我正在使用Archive :: Zip編寫一個perl cgi腳本來創建一個必須由用戶下載的zip文件:這方面沒有問題。該zip在內存中管理,沒有物理文件使用臨時文件或任何其他文件寫入磁盤。我想知道如何允許zip下載寫入流到瀏覽器。我所做的是這樣的:Perl:獲取用於在cgi-bin腳本中使用stdin的句柄

binmode (STDOUT); 
$zip->writeToFileHandle(*STDOUT, 0); 

但我覺得這種方式得到STDOUT作爲文件句柄不安全。它是否正確和強大?有一個更好的方法?

非常感謝您的建議

回答

5

你在做什麼看起來不錯!

+0

誰會改變這個想留下評論的人解釋提問者的代碼有問題嗎? – psmears 2010-06-17 11:52:43

+0

我對此非常抱歉...在批准您的答案時,我錯誤地按錯了按鈕*。事實上,接受你不喜歡的答案是毫無意義的。當我意識到錯誤時,我點擊了上,我得到的消息,該按鈕被鎖定,所以我不能進一步改變上/下狀態。讓我知道我可以如何幫助。對不起, – Daniel 2010-06-17 15:17:02

+0

啊,在這種情況下,沒有問題,謝謝你的解釋:-)當我看到有人投入反對票而沒有花時間解釋他們爲什麼認爲某些東西不好時,它有時會使我惱火。但是任何人都可能發生錯誤點擊;-) – psmears 2010-06-17 15:41:49

3

這是展示virtue of Impatience的好機會。

程序員喜歡將重複的常量字面值分解出來,並將它們放入常量類型的容器中。 (但我會在這裏只是爲了不從重要組成部分,分散使用的變量。)

use IO::File qw(); 
my $handle = bless(\*STDOUT => 'IO::File') 
    or die $OS_ERROR; 
# Why not just `$handle = STDOUT`? Code above is necessary 
# because using bare STDOUT invokes on IO::Handle only 
# which does not have the binmode method. 
⋮ 
$handle->binmode(1); 
$handle->print('something'); 

這看起來不像一個勝利,因爲現在有太多的代碼比以前。如果您決定不再打印至STDOUT,而是立即打印出真正的文件,則可以立即獲得巨大回報。或者也許你想開球輸出。那麼你只需要改變一行代碼而不是幾行代碼。

my $handle = IO::File->new('/var/log/cgi', 'a') 
    or die $OS_ERROR; 
# method calls on $handle stay the same as before