1

その場で圧縮されたxmlファイルを作成してブラウザに送信しようとしています。IO::Compress::Zipそのためにwithを使用しIO::Stringていますが、ドキュメントから期待するように機能しません。

最初に私のコード:

my $zipped_file;
foreach (@{$par{directory}}) {
    my $input = IO::String->new($_->[0]);
    zip $input => \$zipped_file, Append => 1, BinModeIn => 1|0; # Tried both for BinModeIn
}
return $zipped_file;

$par{directory}次の構造を持つ arrayref です。

[
    ['DATA', 'FILENAME'], ['DATA', 'FILENAME'], ...
]

のデータ$par{directory}は次のような文字列です。

<?xml version="1.0" encoding="UTF-8"?>
<derivatives>
     <derivative ag="111520420" vhash="d6712f201155a9afb64dc5a5ba369c99">
        //Some data
    </derivative>
</derivatives>

1 つの空のファイルを含む .zip アーカイブとしてファイルをダウンロードしようとすると、得られるのはすべてです。ここで私が間違っていることについてのヒントはありますか?

前もって感謝します。

編集:これは奇妙です。私は今これを試しました:

use strict;
use warnings;
use IO::Compress::Zip 'zip';

my $xml1 = <<END_XML;
    <?xml version="1.0" encoding="UTF-8"?>
    <derivatives>
        <derivative ag="111520420" vhash="d6712f201155a9afb64dc5a5ba369c99">
            //Some data
        </derivative>
    </derivatives>
END_XML  

my $xml2 = <<END_XML;
    <?xml version="1.0" encoding="UTF-8"?>
    <derivatives2>
         <derivative2 ag="111520420" vhash="d6712f201155a9afb64dc5a5ba369c99">
             //Some data
         </derivative2>
     </derivatives2>
END_XML  

my $files = [[$xml1, 'xml1'], [$xml2, 'xml2']];
my $zipped_file;

foreach (@$files) {
    open my $input, '<', \$_->[0];
    zip $input => \$zipped_file, Append => 1, BinModeIn => 1;
}

open my $fh, '>:raw', 'zip.zip';
print $fh $zipped_file;
close $fh;

アーカイブはまだ空です。

4

2 に答える 2

0

問題は、作成した後に何をしているのかにある可能性が高いと思います$zipped_file

以下のプログラムは私のために働きます。圧縮された文字列をバイナリ ファイルに書き込み、別のユーティリティを使用してそれを解凍すると、元の XML が提供されます。

IO::String代わりに組み込みを放棄して使用したいと思いますがopen my $input, '<', \$_->[0]、どちらの方法でも機能するようです。

use strict;
use warnings;

use IO::Compress::Zip 'zip';
use IO::String;

my $xml = <<END_XML;
<?xml version="1.0" encoding="UTF-8"?>
<derivatives>
     <derivative ag="111520420" vhash="d6712f201155a9afb64dc5a5ba369c99">
        //Some data
    </derivative>
</derivatives>
END_XML

my $zipped_file;

my $input = IO::String->new($xml);

zip $input => \$zipped_file, Append => 0, BinModeIn => 1;

open my $fh, '>:raw', 'zip.zip';
print $fh $zipped_file;
close $fh;

アップデート

ところで、入力データに対して IO ストリームを開く必要はまったくないようです。データを含むスカラーへの参照を渡すだけでかまいません。したがって、上記はちょうどなります

my $zipped_file;

zip \$xml => \$zipped_file, Append => 0, BinModeIn => 1;

open my $fh, '>:raw', 'zip.zip';
print $fh $zipped_file;
close $fh;
于 2013-04-23T12:28:13.217 に答える