0

mod_perlを使用しているWebサイトがあります。

(を使用して)メモリ内に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

編集:上記は廃止されました。Archive :: Zipドキュメントから:

IO::Scalarを避けてください

Archive :: Zipを使用する最も一般的な方法の1つは、メモリ内にZipファイルを生成することです。ほとんどの人はこの目的のためにIO::Scalarを使用しています。

残念ながら、1.11以降、このモジュールはシークを誤って実装しているため、IO::Scalarでは機能しなくなりました。

IO :: Scalarを使用する人は誰でも、IO :: Stringへの移植を検討する必要があります。これは、より小さく、より軽く、通常のシーク可能なファイルハンドルと完全に互換性があるように実装されています。

IO :: Scalar自体は、下位互換性の問題のために実装方法を変更できないため、IO::Scalarのサポートは将来復元されない可能性があります。

于 2011-05-06T11:52:25.840 に答える