[Laravel8.16.0] CSVをimportする

1.fopenして、fputcsvで作成する手法。

public function csv(){
        $ary = [
            ["山田", "12", "O",""],
            ["田中", "20", "A",""],
            ["吉田", "18", "AB",""],
            ["伊藤", "19", "B", "エンジニア"]
        ]; 

        foreach($ary as $key => $value){
             array_splice($ary[$key], 1, 0, "");
        }

        $column = ["名前", "無記入", "年齢", "血液型", "備考"];
        array_unshift($ary, $column);

        $filename = "hogehoge.csv";
        $f = fopen($filename, "w");
        stream_filter_prepend($f,'convert.iconv.utf-8/cp932');
        if($f) {
            foreach($ary as $line){
                fputcsv($f, $line);
            }
        }
        header('Content-Type: application/octet-stream');
        header('Content-Length: '.filesize($filename));
        header('Content-Disposition: attachment; filename=hogehoge.csv');

        readfile($filename);
    }

2. StreamedResponseを使う書き方

public function csv(){
        $data = User::all(); 
        $response = new StreamedResponse(function() use($data){
                $stream = fopen('php://output', 'w');
                stream_filter_prepend($stream, 'convert.iconv.utf-8/cp932//TRANSLIT');
                fputcsv($stream, ['id','name','email',]);
                foreach($data as $user){
                     fputcsv($stream, [$user['id'],$user['name'],$user['email'],]);
                }
                fclose($stream);
        });
        $response->headers->set('Content-Type', 'application/octet-stream');
        $response->headers->set('Content-Disposition', 'attachment; filename="user.csv"');
        return $response;
    }

やってることは一緒なんだけど、StreamedResponseの方が良い。