2010-06-17 48 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