2011-07-11 2 views
1

私はzipファイルを受け取り、抽出するPHPスクリプトを作成しようとしています。私がファイルを取得したときに最初に行うことは、すべてが大丈夫で、zipのフォルダ構造が正しいかどうかを調べるためにファイルを内部に取り出そうとすることです。すべてうまくいけば、スクリプトは続けてファイルを抽出します。問題はここにあります。私がzip_entry_read()をzipエントリに一度だけ呼び出すと、コンテンツが取得されるようですが、同じzipエントリ参照で再度呼び出すと、何も返されません。メタデータはまだそこにあります。 zip_entry_name()、サイズ、およびすべてが正しいデータを返しますが、コンテンツは返しません。 どうしてなぜですか?php zip_entry_read issue

はここだと例。

$target = zip_open("file.zip"); 
while (false !== ($entry = zip_read($target)) { 
    // ... some code here 
    $name = zip_entry_name($entry); // returns filename.txt 
    $filesize = intval(zip_entry_filesize($entry)); // returns the filesize 
    $data = zip_entry_read($entry, $filesize); // returns the content of the file 

    $name = zip_entry_name($entry); // returns the same filename.txt 
    $filesize = intval(zip_entry_filesize($entry)); // returns the same filesize 
    $data = zip_entry_read($entry, $filesize); // ---> returns NOTHING <--- 
    // .. some more code here 
} 

ありがとうございます。

+0

たぶん、あなたはそれを閉じて再び開く必要がありますか? PHPのヘルプで私は見ることができます:_読み取ったデータを返します。ファイルの終わりに達した場合はFALSEを返します。 – Andron

+0

なぜデータを2回抽出しようとしていますか? – thetaiko

+0

私はその地獄のために明示的にデータを2回読んでいません。全体的なプロセスでは、検証ステップで一度ファイルを読み込む必要があり、インストールプロセスは実際にそれらをディスクに書き込んで再度読み込みます。このステップに到達すると、コンテンツはヌルです。ファイルの内容を最初のメモリに読み込んで保存した場合、他の特別なチェックが行われて、内容がzipから読み取られるかどうかがわかります。これは愚かなことです。私はそれを定義された方法で動作させようとしていました。 – TheBrain

答えて

1

私は簡単なテストを実行した、と示唆した溶液(決算と再びエントリを開く)が動作するようには思えdosn't。 2回目の実行でも空の文字列が返されます。とにかく、zip_entry_read関数が単純な文字列を返すので、問題がなければ、別の変数に単純にコピーします。

[UPDATE] 値をコピーするのはオプションではない場合は、ZipArchiveクラスのオブジェクト指向バージョン(オブジェクト指向バージョンのzipライブラリ)を試すことができます。以下のコードのようなものが動作し、希望のzipエントリの2倍を返します。たぶんあなたのニーズに合わせて調整することができます。

target = new ZipArchive(); 
$target->open("file.zip"); 

for($i = 0; $i < $target->numFiles; $i++) 
{ 
    $stat = $target->statIndex($i); 
    print_r($stat); 
    $data = $target->getFromIndex($i); 
    print_r($data); 
    echo "<br />Control<br />"; 
    $data = $target->getFromIndex($i); 
    print_r($data); 
    echo "<br />Control<br />"; 

} 
+0

まあ、私はそれを考えました。しかし、最初のパスはzipファイルを検証するために使用されます。ジップがいいものでなければ、何も行われません。そうである場合、zipエントリは、各ファイルがいくつかのルールに基づいてどこに行くのかを知っているいくつかのクラスに渡されます。私はホッピングしていましたが、抽出されたすべてのデータをメモリに保持するのを避けることができ、読み込みエントリメソッドと同じように動作させることができます。 – TheBrain