0

在 Windows 服务器上使用 perl 5.8.8 我正在使用 Archive::Zip 编写一个 perl cgi 脚本,以创建一个必须由用户下载的 zip:这方面没有问题。zip 在内存中管理,没有物理文件使用临时文件或其他文件写入磁盘。我想知道如何允许 zip 下载将流写入浏览器。我所做的是这样的:

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

但我对这种将 STDOUT 作为文件句柄的方式感到不安全。它是正确的和健壮的吗?有一个更好的方法?

非常感谢您的建议

4

2 回答 2

5

你在做什么看起来不错!

于 2010-06-17T09:47:23.883 回答
3

这是一个展示不耐烦美德的好机会。

程序员喜欢将常量文字的重复分解,并将它们放入常量类型容器中。(但我将在这里简单地使用一个变量,以免分散对重要部分的注意力。)

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
于 2010-06-17T11:29:53.163 回答