Это то, что я создал и работает для меня.Когда пользователь открывает какой-то URL на моей странице, я создаю ZIP-архив на лету и отправляю его пользователю.
Если изменить "-" на "file.zip", он сохранит архив на ваш хостинг / сервер (и не нужно печатать "тип контента").
Пробовал с файлами большого размера (400-500Мб каждый файл) - все в порядке.
use IO::Compress::Zip qw(:all);
my @files = ('example.gif', 'example1.png', 'example2.jpg', 'example3.avi', 'example4.mov');
my $path = "/home/********/**********";
print "Content-Type:application/zip\n";
print "Content-Disposition: attachment; filename=\"filename.zip\"\n\n";
my $z;
foreach my $file (@files) {
if ($z) {
$z->newStream(Name => $file, Method => ZIP_CM_STORE);
} else {
$z = new IO::Compress::Zip "-", Name => $file, Method => ZIP_CM_STORE;
}
open(FILE, "<", "$path/$file");
binmode FILE;
my ($buf, $data, $n);
while (($n = read FILE,$data, 1024) != 0) {
$z->print($data);
}
close(FILE);
}
$z->close;
exit;