前編はこちら。
PHPでフォルダをZIPに圧縮してダウンロードする。その後、ブラウザから解凍エラーで開けない場合の対策。
PHP7にアップグレードしたからか、あるいはブラウザのバージョンが上がったからか・・・
とにかく、以前はできていたPHPでのzipファイルダウンロードが出来なくなった。
zip解凍時のエラーメッセージ:
「マルチボリュームセットの最後ディスクを挿入してください」
ブラウザからダウンロードしたファイルを開こうとすると、
「マルチボリュームセットの最後ディスクを挿入してください」
と警告メッセージが出て、開けない。
そして、zipファイルのファイルサイズも極小。
(0バイトではないけど、正常なファイルサイズよりも明らかに小さい。)
だけど、サーバのzipファイルを確認すると正常。
FTPでダウンロードすれば、正常に解凍できる。
というわけで、急遽対応。
PHP
// フォルダを指定。(この場合、出来上がるzipファイル名は「var/www/.../download/test.zip」になる。)
$zip_folder_path = "var/www/.../download/test";
// Linuxコマンドで、権限を755に変更:お好みで。
exec("chmod 755 " . $zip_folder_path . "/*");
// コマンドでZIPにする
$command = "cd ". $zip_folder_path .";".
"zip -r ". $zip_folder_path .".zip .";
// Linuxコマンドで、フォルダをzip化
exec($command);
// 権限を755に変更:お好みで。
chmod($zip_folder_path .".zip", 0755);
$path = explode("/",$zip_folder_path);
$zip_filename = end($path).".zip";
// 圧縮ファイルをダウンロードする。
$file=$zip_folder_path.".zip";
if (headers_sent()) {
echo 'HTTP header already sent';
} else {
if (!is_file($file)) {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
echo 'File not found';
} else if (!is_readable($file)) {
header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
echo 'File not readable';
} else {
mb_http_output( "pass" ) ;
header("Pragma: public");
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=\"".basename($file)."\"");
ob_end_clean(); // 出力バッファをクリア
readfile($file);
}
}
//ファイルとフォルダを削除:お好みで。
unlink($zip_folder_path.".zip");
remove_dir($zip_folder_path);
exit;
コメントの「// 圧縮ファイルをダウンロードする。」以降を大幅に変更。
結構がっつり変更となった。
一件落着。