まず配列からカンマ区切りの文字列を作る。
private function _createCsvStr()
{
$csvData = array(
array(1, 2, 3),
array('A', 'B', 'C'),
);
// カンマ区切りの文字列に変換
$response = '';
foreach ($csvData as $row) {
$response .= implode(',', $row) . "\n"; // LFなら\n CRLFなら\r\n
}
return $response;
}
実際にはデータベース等から読み込んで配列を作る処理を書くことになる。
次にCSVファイルを作るコード。
private function _createCsvFile($text, $dir, $encoding=null)
{
try {
$subdir = $dir . '/';
$file_name = date('YmdHis') . '.csv';
// 文字コード変換(必要な場合)
switch ($encoding) {
case null:
$encodedData = $text;
break;
case 'UTF-8BOM':
$encodedData = "\xEF\xBB\xBF" . $text;
break;
default:
$encodedData = mb_convert_encoding($text, $encoding, 'UTF-8');
break;
}
// ファイルに出力
Storage::disk('public')->put($subdir.$file_name, $encodedData);
} catch (\Exception $e) {
Log::error($e->getMessage());
}
return true;
}
文字コードがUTF-8で良いなら、変換部分はスキップして良いだろう。
次にZipファイルを作るコード。
private function _createZip($dir)
{
$target_path = storage_path('app/public/') . $dir;
$zip_path = $target_path . '.zip';
if (file_exists($target_path)) {
$files = glob($target_path . '/*');
$zip = new ZipArchive();
// ファイルをZipに追加
$zip->open($zip_path, ZipArchive::CREATE);
foreach ($files as $file) {
$file_info = pathinfo($file);
$file_name = $file_info['filename'] . '.' . $file_info['extension'];
$zip->addFile($file, $file_name);
}
$zip->close();
// 成功したら作業フォルダを削除
if (file_exists($zip_path)) {
Storage::disk('public')->deleteDirectory($dir);
return $zip_path;
}
}
return false;
}
use ZipArchive;
が必要。
特に何かパッケージ等をインストールする必要はない。
最後にそれぞれの関数を呼び出してダウンロードするところ。
public function download()
{
$dir_name = date('Ymd');
// CSV作成
$csv_data = $this->_createCsvStr();
$this->_createCsvFile($csv_data, $dir_name);
// 2つめ以降のファイルも追加していく
$csv_data2 = $this->_createCsvStr2();
$this->_createCsvFile($csv_data, $dir_name);
// zip作成
$zip_path = $file->createZip($dir_name);
// ファイル出力(ダウンロードさせる)
return response()->download($zip_path);
}
コメント