Распечатать Архив :: Zip-файл в Apache2 :: RequestIO объект - PullRequest
0 голосов
/ 06 мая 2011

У меня есть веб-сайт, использующий mod_perl.

Я создаю zip-файл в памяти (используя Archive::Zip) и хочу отправить этот файл без необходимости записи его на диск.

Archive::Zip будет выводить только в указанный дескриптор файла, и я не думаю, что Apache2::RequestIO предоставит мне его.

В данный момент я просто печатаю Zip-файл в * STDOUT, и это работает,Но я уверен, что есть лучший способ сделать это.Я печатаю все остальное через объект RequestRec, например $r->print(...)

Ответы [ 2 ]

2 голосов
/ 17 апреля 2018

В версиях 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);

Я думаю, что, возможно, есть более оптимальный способ сделать это, но он работает ...

2 голосов
/ 06 мая 2011

Как-то так должно помочь ...

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

EDIT: Вышеизложенное является устаревшим. из архива :: Zip документы:

Старайтесь избегать IO :: Scalar

Одним из наиболее распространенных способов использования Archive :: Zip является генерация Zip файлы в памяти. Большинство людей используют IO :: Scalar для этой цели.

К сожалению, по состоянию на 1.11 этот модуль больше не работает с IO :: Scalar поскольку это неправильно реализует поиск.

Любой, кто использует IO :: Scalar, должен подумать о портировании на IO :: String, что меньше, легче и реализован для полной совместимости с обычными ручками поиска файлов

Поддержка IO :: Скаляр, скорее всего, не будет восстановлен в будущем, поскольку IO :: Scalar сам по себе не может изменить способ его реализации из-за проблемы обратной совместимости.

...