Print Archive :: Zip zip文件到Apache2 :: RequestIO对象

时间:2011-05-06 10:02:06

标签: perl apache apache2 zip mod-perl

我有一个使用mod_perl的网站。

我正在内存中创建一个zip文件(使用Archive::Zip),我想要提供该文件,而不必将其写入磁盘。

Archive::Zip只会输出到指定的文件句柄,我不认为Apache2::RequestIO为我提供了一个。

目前我只是将Zip文件打印到* STDOUT并且可以正常工作。但我确信有更好的方法来做到这一点。我正在通过RequestRec对象打印其他所有内容,例如$r->print(...)

2 个答案:

答案 0 :(得分:2)

这样的事情应该会有所帮助...

use Archive::Zip;
my $zip = Archive::Zip->new();
#create your zip here

use IO::Scalar;
my $memory_file = '';   #scalar as a file
my $memfile_fh = IO::Scalar->new(\$memory_file); #filehandle to the scalar

# write to the scalar $memory_file
my $status = $zip->writeToFileHandle($memfile_fh);
$memfile_fh->close;

#print with apache
#$r->content_type(".......");
$r->print($memory_file);    #the content of a file-in-a-scalar

编辑: 以上是阻挠的。 来自Archive::Zip文档:

  

尽量避免IO :: Scalar

     

使用Archive :: Zip的最常用方法之一是生成Zip   文件在内存中。大多数人为此目的使用IO :: Scalar。

     

不幸的是,从1.11开始,这个模块不再适用于IO :: Scalar   因为它错误地实现了寻求。

     

任何使用IO :: Scalar的人都应考虑移植到IO :: String,其中   更小,更轻,并且实现完全兼容   有规律的可搜索文件句柄。

     

对IO :: Scalar的支持很可能在将来不会被恢复,   因为IO :: Scalar本身不能改变它的实现方式   反向兼容性问题。

答案 1 :(得分:2)

在Perl 5.8+版本中,您似乎可以一起跳过IO :: Scalar和IO :: String。

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
my $zip = Archive::Zip->new();

my $memory_file = '';   #scalar as a file
open(my $fh, '>', \$memory_file) || die "Couldn't open memory file: $!";

my $status = $zip->writeToFileHandle($fh);
$fh->close;

$r->print($memory_file);

我认为这可能是一种更优化的方式,但它有效......