4
function showimage($zip_file, $file_name) {
    if (file_exists($zip_file)) {
        $zip = zip_open($zip_file);
        while ($zip_entry = zip_read($zip)) {
            if (zip_entry_open($zip, $zip_entry, "r")) {
                if (zip_entry_name($zip_entry) == $file_name) {
                    $theimg = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                    $theimg = imagecreatefromstring($theimg);
                    if ($theimg !== false) {
                        header('Content-Type: image/jpeg');
                        imagejpeg($theimg);
                        imagedestroy($theimg);
                    }
                    else { echo "Could not create image."; }
                    zip_entry_close($zip_entry);
                }
            }
            else { echo "Could not open."; }
        }
        zip_close($zip);
    }
    else { echo "File not found."; }
}

この関数を実行して指定された zip ファイルを開き、コンテンツをループして指定されたファイル名を見つけ、そのファイルから抽出する必要なくイメージを作成しています。私は、このプロセスがどのようにシステム集約的であるか、また、ループして名前が指定されたファイル名と一致するかどうかを確認する必要なく、zip アーカイブ内のファイルを見つけるためのよりきちんとした/より直接的な方法があれば、ちょっと興味がありました。ファイルが存在すると仮定して、指定された名前のzipファイルから直接ファイルを呼び出す方法はありますか?

上記のコードは機能します...私はそれをより良くする方法を見ようとしているだけだと思います。それが理にかなっていれば。

4

2 に答える 2

6

ZipArchive には、実際にファイルを検索せずにファイルを取得する方法があります。

function showimage($zip_file, $file_name) {
    $z = new ZipArchive();
    if ($z->open($zip_file) !== true) {
        echo "File not found.";
        return false;
    }

    $stat = $z->statName($file_name);
    $fp   = $z->getStream($file_name);
    if(!$fp) {
        echo "Could not load image.";
        return false;
    }

    header('Content-Type: image/jpeg');
    header('Content-Length: ' . $stat['size']);
    fpassthru($fp);
    return true;
}
于 2012-04-19T21:44:34.830 に答える
2

Brad が上で述べたように、GD ライブラリを使用してファイルやその他の書き込みを行う必要はありません。zip_entry_read() 関数の結果をエコーし​​て、Content-Type を設定するだけです。次のようなものを使用できます。



    function showimage($zip_file, $file_name) {
        if (file_exists($zip_file)) {
            $zip = zip_open($zip_file);
            while ($zip_entry = zip_read($zip)) {
                if (zip_entry_open($zip, $zip_entry, "r")) {
                    if (zip_entry_name($zip_entry) == $file_name) {
                        $theimg = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                        if ($theimg !== null) {
                            header('Content-Type: image/jpeg');
                            echo $theimg;
                        }
                        else { echo "Could not load image."; }
                        zip_entry_close($zip_entry);
                    }
                }
                else { echo "Could not open."; }
            }
            zip_close($zip);
        }
        else { echo "File not found."; }
    }

GD ライブラリをロードしないだけで、パフォーマンスがかなり向上すると思います。

于 2012-04-19T21:30:25.947 に答える