
よろしくお願いします。
ディレクトリをまるごとzipでダウンロードしたいです。
Windows8.1
php 5.4.39
Apache 2.2.14
localでの実行です。
ziptest
|
|-mysite
| |-image
| | |-image1.png
| |-file1.php
| |-file2.php
|
|-exe.php(zipに圧縮する処理が書かれたファイル。これを実行する。)
上記が私の環境です。
やりたいことですが、mysiteの中身を丸ごとzipで圧縮してダウンロードをしたいという事です。
mysite
|
|-image
| |-image1.png
|
|-file1.php
|-file2.php
上記のような状態のものを、zipで圧縮してダウンロードすることが目標です。
現状ですが、
mysite/image(imageフォルダ)を消した場合、
(以下、パターン1)
mysite.zip
|
|-mysite
| |-file1.php
| |-file2.php
|
|-file1.php
|-file2.php
このような形でzipが出来上がりました。
ちなみに、
$zip->addFromString($filename,file_get_contents($filepath));
こちらをコメントアウトした状態で実行すると、
(以下、パターン2)
mysite.zip
|
|-mysite
| |-file1.php
| |-file2.php
このような形でzipで出来上がります。
どちらにせよ、imageフォルダが存在していると圧縮が出来ません。
どこが原因になっているのでしょうか?
以下にコードを記載します。
php
1<php 2 3//Zipクラスロード 4$zip = new ZipArchive(); 5 6//Zipファイル名指定 7$zipFileName = 'mysite.zip'; 8 9//Zipファイル一時保存ディレクトリ取得 10$zipTmpDir = '/phpdocs/nonprothemes'; 11 12//Zipファイルオープン 13$result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 14 15if ($result !== true) { 16 return false; 17} 18 19//処理制限時間を外す 20set_time_limit(0); 21 22 23/* ファイルパスを指定する処理 */ 24 25//mysite内のファイル一覧取得 26//ディクトリパス格納用変数 27$dir = null; 28$dir = 'mysite/'; 29 30//ハンドル取得用変数 31$handle = null; 32//ファイル情報取得用変数 33$file = null; 34//ファイルパス指定用配列 35$fpath_array = array(); 36 37//ディレクトリの存在確認、ハンドル取得 38if(is_dir($dir) && $handle = opendir($dir)) 39{ 40 //ディレクトリ内のファイルを取得 41 while(($file = readdir($handle)) !== false) 42 { 43 //'.','..'を取り除く処理 44 if($file != "." && $file != "..") 45 { 46 //ファイルパス指定 47 $fpath_array[] = 'mysite/'.$file; 48 } 49 } 50} 51 52//ファイルパス指定 53//$fpath_array = array('mysite/style.css','mysite/index.php'); 54/* ここまで */ 55 56//Zip追加処理 57foreach ($fpath_array as $filepath) { 58 //filename取得 59 $filename = basename($filepath); 60 61 //取得ファイルをZipに追加 62 $zip->addFromString($filename,file_get_contents($filepath)); 63 $zip->addFile($filepath); 64} 65 66$zip->close(); 67 68// ストリームに出力 69header('Content-Type: application/zip; name="' . $zipFileName . '"'); 70header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); 71header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); 72echo file_get_contents($zipTmpDir.$zipFileName); 73 74// 一時ファイルを削除しておく 75unlink($zipTmpDir.$zipFileName); 76?>
どこが原因になっているでしょうか?
よろしくお願いします。
/********* 追記 **********/
回答してくださった方の意見を元に、コードを修正しました。
結果、中身の無いzipが出来上がりました。
ただ、zipフォルダはサイズが8KBあります。
どういう状況なのか見当がつきません。
原因について分かることがあれば意見をお願いしたいです。
php
1$dist = 'mysite.zip'; // 生成する圧縮ファイル名 2$path = './mysite'; // 圧縮するパス 3$zipTmpDir = '/phpdocs/nonprothemes'; // 一時パス 4 5 6$zip = new ZipArchive(); 7$zip->open($zipTmpDir.$dist, ZipArchive::CREATE | ZipArchive::OVERWRITE); 8addZip($zip, $path); 9$zip->close(); 10 11function addZip($zip, $path) { 12 if (is_dir($path)) { 13 $files = array_diff(scandir($path), ['.', '..']); 14 foreach ($files as $file) addZip($zip, "$path/$file"); 15 } else { 16 $zip->addFile($path); 17 } 18} 19 20// ストリームに出力 21header('Content-Type: application/zip; name="' . $dist . '"'); 22header('Content-Disposition: attachment; filename="' . $dist . '"'); 23header('Content-Length: '.filesize($zipTmpDir.$dist)); 24echo file_get_contents($zipTmpDir.$dist); 25 26// 一時ファイルを削除しておく 27unlink($zipTmpDir.$dist);

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。