ディレクトリを丸ごとzipでダウンロードしたい
よろしくお願いします。
ディレクトリをまるごとzipでダウンロードしたいです。
Windows8.1
php 5.4.39
Apache 2.2.14
localでの実行です。
mysite
|
|-image
| |-image1.png
|
|-file1.php
|-file2.php
上記のような状態のものを、zipで圧縮してダウンロードすることが目標です。
コードは以下の通りです。
<php
//Zipクラスロード
$zip = new ZipArchive();
//Zipファイル名指定
$zipFileName = 'mysite.zip';
//Zipファイル一時保存ディレクトリ取得
$zipTmpDir = '/phpdocs/nonprothemes';
//Zipファイルオープン
$result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($result !== true) {
return false;
}
//処理制限時間を外す
set_time_limit(0);
/* ファイルパスを指定する処理 */
//mysite内のファイル一覧取得
//ディクトリパス格納用変数
$dir = null;
$dir = 'mysite/';
//ハンドル取得用変数
$handle = null;
//ファイル情報取得用変数
$file = null;
//ファイルパス指定用配列
$fpath_array = array();
//ディレクトリの存在確認、ハンドル取得
if(is_dir($dir) && $handle = opendir($dir))
{
//ディレクトリ内のファイルを取得
while(($file = readdir($handle)) !== false)
{
//'.','..'を取り除く処理
if($file != "." && $file != "..")
{
//ファイルパス指定
$fpath_array[] = 'mysite/'.$file;
}
}
}
//ファイルパス指定
//$fpath_array = array('mysite/style.css','mysite/index.php');
/* ここまで */
//Zip追加処理
foreach ($fpath_array as $filepath) {
//filename取得
$filename = basename($filepath);
//取得ファイルをZipに追加
$zip->addFromString($filename,file_get_contents($filepath));
$zip->addFile($filepath);
}
$zip->close();
// ストリームに出力
header('Content-Type: application/zip; name="' . $zipFileName . '"');
header('Content-Disposition: attachment; filename="' . $zipFileName . '"');
header('Content-Length: '.filesize($zipTmpDir.$zipFileName));
echo file_get_contents($zipTmpDir.$zipFileName);
// 一時ファイルを削除しておく
unlink($zipTmpDir.$zipFileName);
?>
現在、
Warning: file_get_contents(mysite/images): failed to open stream:
Permission denied in C:\phpdocs\nonprothemes\file_dw.php on line 62Warning: Cannot modify header information - headers already sent by
(output started at C:\phpdocs\nonprothemes\file_dw.php:62) in
C:\phpdocs\nonprothemes\file_dw.php on line 69Warning: Cannot modify header information - headers already sent by
(output started at C:\phpdocs\nonprothemes\file_dw.php:62) in
C:\phpdocs\nonprothemes\file_dw.php on line 70Warning: filesize(): stat failed for /phpdocs/nonprothemesmysite.zip
in C:\phpdocs\nonprothemes\file_dw.php on line 71Warning: Cannot modify header information - headers already sent by
(output started at C:\phpdocs\nonprothemes\file_dw.php:62) in
C:\phpdocs\nonprothemes\file_dw.php on line 71Warning: file_get_contents(/phpdocs/nonprothemesmysite.zip): failed to
open stream: No such file or directory in
C:\phpdocs\nonprothemes\file_dw.php on line 72Warning: unlink(/phpdocs/nonprothemesmysite.zip): No such file or
directory in C:\phpdocs\nonprothemes\file_dw.php on line 75
これらのエラーが出ています。
apacheの権限の問題なのかと思ったのですが、ネットで調べてみてもhttpd.confのどこにどう記述すればいいのかが分かりませんでした。
参考になるサイトなどありましたら教えていただきたいです。
XAMPPで動かしているときには正常に動いていましたが、XAMPPを消してApacheを入れなおしたら今回のようなことになってしまいました。
どのようにして解決したら良いでしょうか?
よろしくお願いします。
/********* 追記 ***********/
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で出来上がります。
/********* 追記 ***********/
コードを修正した結果、
中身の無い(?)8KBのzipフォルダが作成されました。
ファイルを追加する所で代わりにファイルパスを表示した所、問題なくパスが来ていました。
以下コードです。
$dist = 'mysite.zip'; // 生成する圧縮ファイル名
$path = './mysite'; // 圧縮するパス
$zipTmpDir = '/phpdocs/nonprothemes'; // 一時パス
$zip = new ZipArchive();
$zip->open($zipTmpDir.$dist, ZipArchive::CREATE | ZipArchive::OVERWRITE);
addZip($zip, $path);
$zip->close();
function addZip($zip, $path) {
if (is_dir($path)) {
$files = array_diff(scandir($path), ['.', '..']);
foreach ($files as $file) addZip($zip, "$path/$file");
} else {
$zip->addFile($path);
}
}
// ストリームに出力
header('Content-Type: application/zip; name="' . $dist . '"');
header('Content-Disposition: attachment; filename="' . $dist . '"');
header('Content-Length: '.filesize($zipTmpDir.$dist));
echo file_get_contents($zipTmpDir.$dist);
// 一時ファイルを削除しておく
unlink($zipTmpDir.$dist);