我有一个使用mod_perl的网站。
我正在内存中创建一个zip文件(使用Archive::Zip
),我想要提供该文件,而不必将其写入磁盘。
Archive::Zip
只会输出到指定的文件句柄,我不认为Apache2::RequestIO
为我提供了一个。
目前我只是将Zip文件打印到* STDOUT并且可以正常工作。但我确信有更好的方法来做到这一点。我正在通过RequestRec对象打印其他所有内容,例如$r->print(...)
答案 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);
我认为这可能是一种更优化的方式,但它有效......