#はじめに
前回の記事【PHP】Excelで文字化けしないCSVファイル作成の続き?というより最終的にやりたかったことを備忘録として記事にします。
非同期通信で、DBからテーブルごとのCSVを作成し、ZIPに圧縮してダウンロードさせる!!!
やっていきましょう!
#コード
クライアント側 JS
var request = new XMLHttpRequest();
request.open('GET', '/getZip', true);
request.responseType = "blob";
request.onload = function (oEvent) {
var blob = request.response;
var objectURL = window.URL.createObjectURL(blob);
// リンクを作成し、JavaScriptからクリック
var link = document.createElement("a");
document.body.appendChild(link);
link.href = objectURL;
link.download = 'ZIPファイル名';
link.click();
document.body.removeChild(link);
};
request.send(null);
サーバ側 PHP
// ZipArchiveクラス初期化
$zip = new ZipArchive();
// Zipファイルパス
$zipFileNm = 'ZIPファイル名(拡張子付)';
$zipFilepath = 'ZIPファイルパス'.$zipFileNm;
// Zipファイルオープン
$result = $zip->open($zipFilepath, ZIPARCHIVE::CREATE);
if($result !== true){
//ZIPファイル作成失敗時の処理
}
// CSV作成 前回記事関数
$csvFilePath = createCSV('CSVファイル名', 'データカラム', 'データ本体');
// CSVファイルをZIPに追加
$zip->addFile($csvFilePath, 'CSVファイル名');
// Zipファイルクローズ
$zip->close();
// HTTPヘッダを設定
mb_http_output( "pass" );
header("Pragma: public");
header('Content-Type: application/force-download;');
header('Content-Length: '.filesize($zipFilepath));
header("Content-Disposition: attachment; filename=$zipFileNm");
ob_end_clean();
// ファイル出力(ダウンロードさせる)
readfile($zipFilepath);
// Zipファイル削除
if(!unlink($zipFilepath)){
//ZIPファイル削除失敗時の処理
}
// CSVファイルの削除
$delFileName = "CSVファイル保存パス/*.csv";
foreach(glob($delFileName) as $val){
if(!unlink($val)){
// CSVファイル削除失敗時の処理
}
}
参考
PHPでCSVダウンロード
PHPでファイルをZIPファイルに圧縮する方法【初心者向け】
#最後に
だらだら長いコードだと思います。
あと、これで本当に良いのかな~と疑問。処理は動くけども。
こうした方が良い等ありましたら、アドバイスください!!!