PHPでフォルダをZIPに圧縮してダウンロードする。その後、ブラウザから解凍エラーで開けない場合の対策。その2


前編はこちら。
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;

 

コメントの「// 圧縮ファイルをダウンロードする。」以降を大幅に変更。

結構がっつり変更となった。

 

一件落着。