2

PHP Zip Archive によって生成された zip ファイルを開こうとすると、アラートが表示されます。

「Windows はフォルダーを開けません。圧縮 (zip 形式) フォルダー 'filename' は無効です。」Windows エクスプローラーで開くときにエラーが発生しました。

しかし、7-zip でファイルを開くことができます。何らかの理由で、Windows エクスプローラーで zip ファイルを開くことができるようにする必要があります。zip ファイルの生成に問題はありますか? 助けてください!

function create_a_zip($files = array(),$dest = '',$root_folder,$overwrite = false) {
        if(file_exists($dest) && !$overwrite) {
            return false;
        }
        $valid_files = array();
        if(is_array($files)) {
            foreach($files as $file) {
                if(file_exists($file)) {
                    $valid_files[] = $file;
                }
            }
        }

        if(count($valid_files)) {
            $zip = new ZipArchive();
            if($zip->open($dest,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
                return false;
            }
            foreach($valid_files as $valid_file) {
                if(is_dir($valid_file) === true){
                    foreach(glob($valid_file . '/*') as $file){
                        $zip->addFile($file, $root_folder . $file);
                    }

                }else if (is_file($valid_file) === true){
                    $zip->addFile($valid_file, $root_folder . $valid_file);
                }
            }
            $zip->close();

            return file_exists($dest);
        }
        else
        {
            return false;
        }
    }
4

5 に答える 5

12

私にとっての解決策は、ob_end_clean()zipファイルの内容を出力する前に使用することでした(コメントで@Ywisが指摘したように)...

ob_end_clean();
readfile($zipfilename); // outputs zip file's content

...その前に文字を出力しなくても。

于 2015-08-22T02:28:31.447 に答える
1

問題の原因は次のとおりだと思います。

$zip->addFile($file,$file);

zip に追加するファイルと同じディレクトリに php スクリプトがない場合は、ファイル パスを含める必要があります。addFile の 2 番目のパラメーターは zip 内のファイルの名前であるため、$file 変数にパスが含まれている場合、問題の原因はおそらくそこにあります。コードを次のように変更してみてください。

$filenameonly = preg_replace("/(.*)\/?([^\/]+)/","$2",$file);
$zip->addFile($file,$filenameonly );

これにより、ファイル パス (存在する場合) が削除され、addFile の 2 番目の変数のファイル名のみが残ります。

これで問題が解決する場合は、問題がファイル名にあることが確実にわかり、簡単に特定できます。

于 2012-11-30T13:44:57.130 に答える
0

たとえば、パラメーターとして絶対パスに送信するだけ$abspathです。次に、それを使用します

$filenameonly = str_replace($abspath,"",$file);
$zip->addFile($file, $filenameonly);

Window 8 でも 100% 動作し、圧縮したファイルもフォルダーに保存されます。

于 2013-05-09T16:13:41.793 に答える
0

str_replace 文字列関数を使用する代わりに、組み込みのファイル システム関数を使用できます。

$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME));
于 2014-10-03T05:29:23.547 に答える