LaravelでCSVをZipアーカイブに圧縮してダウンロードする

まず配列からカンマ区切りの文字列を作る。

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);
}

参考

関連記事

コメント

この記事へのコメントはありません。

TOP