0

我有一个使用 mod_perl 的网站。

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

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

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

4

2 回答 2

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

编辑:以上内容已过时。来自存档::Zip文档:

尽量避免 IO::Scalar

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

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

任何使用 IO::Scalar 的人都应该考虑移植到 IO::String,它更小、更轻,并且被实现为与常规可搜索文件句柄完美兼容。

对 IO::Scalar 的支持很可能在未来不会恢复,因为 IO::Scalar 本身由于向后兼容性问题而无法更改其实现方式。

于 2011-05-06T11:52:25.840 回答
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);

我认为可能有一种更优化的方法来做到这一点,但它确实有效......

于 2018-04-17T07:32:25.537 回答