- ベストアンサー
PHP階層構造を維持してディレクトリを圧縮する方法
- 指定したディレクトリ内のサブディレクトリやファイルを階層構造を維持したまま圧縮する方法について説明します。
- 参考サイトのコードを使用する際にエラーが発生し、例外処理に関する理解が不足しているため、エラーの内容を理解することが困難です。
- PHPでディレクトリを圧縮する際には、ZipArchiveクラスを使用し、再帰的にディレクトリを走査してファイルを圧縮する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1つ目の Call to undefined function zipDirectory() のエラーがでるのは、 if(isset($_POST["download"])){ ~ } のif () 中で、function宣言をしているからですね。 2つ目のWarningは 出力するzipファイル名を $file = dirname(__FILE__); としているからでしょう。 サンプルにされたサイトでは、 $file = './test.zip'; と記載しておられます。 ちなみに、 if(isset($_POST["download"])){ に 'download' という文字があるので 気になりましたが、 このサンプルコードは、サーバー上にzipファイルを作るだけで ダウンロードまでしてくれるコードには、なっていないですよ。
その他の回答 (2)
- t_ohta
- ベストアンサー率38% (5241/13712)
> Warning: ZipArchive::addEmptyDir(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 161 > Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 159 ファイルの追加もディレクトリの追加も両方同じエラーになっているので、ループ処理の中にきた時点で $zip に問題があるのでしょう。 まずは、アーカイブファイルを作って適当な名前のフォルダを1つ追加する処理が問題なく動作するかや、ファイルを1つ決め打ちで指定してアーカイブできるか確認するところからやってみてはどうでしょう。
補足
何とか取得して圧縮からダウンロードまではできましたが、ファイルしか取得が出来ず階層構造が維持できません汗 もう少しがんばってみます。 現在のコード define("file_zone","C:/MAMP/htdocs/upload/test/"); //圧縮 if(isset($_POST["download"])){ //配列で取得する function list_files($dir){ $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $list[] = $pathname; } return $list; } //圧縮作業 $dir = file_zone; $files = list_files($dir); $zip = new ZipArchive($files); // Zipファイル名 $zipFileName = date("Ymds") .'.zip'; // Zipファイル一時保存ディレクトリ $zipTmpDir = file_zone; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE); if ($result !== true) { // 失敗した時の処理 } // 処理制限時間を外す set_time_limit(0); foreach ($files as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); readfile(); // 一時ファイルを削除しておく // unlink($zipTmpDir.$zipFileName);
- t_ohta
- ベストアンサー率38% (5241/13712)
エラーメッセージは「upload\upload-file.php」の134行目で呼び出している「zipDirectory()」なんて関数は知らないよと言ってます。 書かれているコードが50行しか無いので、どこが134行目なのか分りませんが、関数の定義の仕方か、呼び出す際の呼び出し位置などが原因の可能性が考えられます。
補足
ご返信ありがとうございます。134行目はzipDirectory($dir, $file); になっています。関数の呼び出し方はまちがっていないとは思うのですがうまくいかないですね一度位置をzipDirectory関数の下に記述すると Warning: ZipArchive::addEmptyDir(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 161 Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 159 Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 159 Warning: ZipArchive::addEmptyDir(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 161 Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 159 Warning: ZipArchive::addEmptyDir(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 161 Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 159 Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 159 Warning: ZipArchive::addEmptyDir(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 161 Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 159 Warning: ZipArchive::close(): Invalid or uninitialized Zip object in C:\MAMP\htdocs\upload\upload-file.php on line 165 と表示されます。
お礼
無事できました。ありがとうございます!!!ifの中に入れてたのを変えました
補足
そうなんですね、初歩的なことですいません。勉強になります。 確かにエクスプローラーで開こうとすると無効とでます汗