我有一个使用 mod_perl 的网站。
我正在内存中创建一个 zip 文件(使用Archive::Zip
),并且我想提供该文件而不必将其写入磁盘。
Archive::Zip
只会输出到指定的文件句柄,我不认为Apache2::RequestIO
提供给我一个。
目前,我只是将 Zip 文件打印到 *STDOUT,这样就可以了。但我确信有更好的方法来做到这一点。我正在通过 RequestRec 对象打印其他所有内容,例如$r->print(...)
像这样的东西应该有帮助......
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
编辑:以上内容已过时。来自存档::Zip文档:
尽量避免 IO::Scalar
使用 Archive::Zip 的最常见方法之一是在内存中生成 Zip 文件。大多数人为此目的使用 IO::Scalar。
不幸的是,从 1.11 开始,该模块不再适用于 IO::Scalar,因为它错误地实现了查找。
任何使用 IO::Scalar 的人都应该考虑移植到 IO::String,它更小、更轻,并且被实现为与常规可搜索文件句柄完美兼容。
对 IO::Scalar 的支持很可能在未来不会恢复,因为 IO::Scalar 本身由于向后兼容性问题而无法更改其实现方式。
在 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);
我认为可能有一种更优化的方法来做到这一点,但它确实有效......