streamDownload を使って CSV をダウンロードするサンプルです。Controller の処理だけ書いておきます。 (簡単なサンプルなので、諸々抜けています。) public function csvDownload() { return response()->streamDownload(function () { $handle = fopen('php://output', 'w'); $list = [[1,'hoge'], [2,'piyo'], [3, 'fuga']]; foreach ($list as $row) { fputcsv($handle, $row); } fclose($handle); }, 'sample.csv'); } 公式ドキュメント => https://laravel.com/docs/6.x/responses#file-do
LaravelでCSV出力を実装してみたので手順をまとめます。 動作確認はLaravel 6でしていますが、この記事の内容は5.6以降で利用可能です。 CSVのサイズが大きくなる場合は、コントローラはCSV生成タスクをバックグラウンドキューに入れて非同期ジョブでCSVを生成してS3などのストレージに追加、処理が完了したらファイルのURLを応答に含めて通知するというのが正しい実装な気がしますが、ここではCSVに含めるレコードが少なくファイルサイズが小さめな限定的なケースを想定し、CSVを生成しながらそのまま応答ストリームに流すような実装について解説します。 小さめと書きましたが、プロセスのメモリーを節約して実行するのでネットワーク環境と多重度が低くプロセスを長めに専有することを許容できるシステムであれば大量レコードでも使えるのでプロジェクトによっては大量レコードのダウンロードにも使える仕組み
レスポンスの生成Creating Responses 文字列と配列Strings & Arrays 当然ながらすべてのルートやコントローラは、ユーザーのブラウザーに対し、何らかのレスポンスを返す必要があります。Laravelはレスポンスを返すためにさまざまな手段を用意しています。一番基本的なレスポンスは、ルートかコントローラから文字列を返します。フレームワークが自動的に、文字列を完全なHTTPレスポンスへ変換します。All routes and controllers should return a response to be sent back to the user's browser. Laravel provides several different ways to return responses. The most basic response is returning a
5.4の記事ばっかり書いてるけどLTSの5.5で書きたいのが本音。 前提 Laravel 5.4 PHP7.1 DBはUTF-8(MySQLならutf8mb4 + mysqlnd とする) 解決したいこと Databaseから1000万行あるデータとかをCSVとして出力したい (普通に全件出力するとメモリオーバーする) CSVはWindows Excel で文字化けせずに開きたい レスポンスするファイル名が日本語だった場合の問題は今回は無視 解決方法 SQLのカーソルを開き、適当なレコード数毎に出力 Symfony のStreamedResponseを使う 全部取ってきて~ってやるとPHPのメモリにどかっと結果セットが乗ってしまうので、RDBのカーソル開いて1行ごとに出力を行う。 レスポンスの作成 StreamedResponseのコールバック関数を定義する。 Laravelって書いたけど
前回びくついていた健康診断ですが無事終了しました。加藤です。 最近業務でLaravelを使ったCSVファイルのインポート・エクスポートのプログラムを作成したので、備忘のためにポイントを記事にしようと思います。 インポート インポートのポイント (1)SplFileObjectクラスを使う (2)実行時間に注意 エクスポート エクスポートのポイント (1)文字コードに注意 (2)StreamedResponseクラスを使う インポート <?php use Illuminate\Http\Request; public function import_csv(Request $request) { // アップロードファイルのファイルパスを取得 $file_path = $request->file('csv')->path(); // CSV取得 $file = new \SplFileOb
Laravel 5.7でCSVをダウンロードするときに内容が画面に表示されてしまう CSVファイルをダウンロードする機能の作成を依頼していて、 質問されたが原因が全然分からなかった。 環境 CentOS 7.5 PHP 7.2.10 Laravel 5.7 現象 一定までのサイズならCSVファイルがダウンロードされるが、 一定のサイズを超えると内容が画面に表示される。 とりあえずメモリリークしてね?とは思ったが、今回の問題には関係ないので触れないでおいた。 問題のコード public function csvDownload(Request $request) { $headers = [ 'Content-Type' => 'text/csv', 'Content-Disposition' => 'attachment; filename="users.csv"' ]; $stream
このブログでは、帯域の削減とページ表示を高速化する目的でgzip圧縮して転送しています。 ただ、「Apache deflate 設定」とかで調べると「ん?、それ必要なの?/間違ってない?」と思う様な設定例が沢山ヒットします。 「自分の設定が完璧だ!」と主張するつもりはありませんが、少しでも正しい(と思える)情報を掲載したいので。 圧縮して転送すると? 圧縮して転送するのはページの表示速度を向上する目的でもほぼ全方位からおススメされている方法です。 圧縮にCPUリソースを利用しますが、上り帯域の節約や転送に掛かる時間が短縮される事を考えるとむしろプラスです。(一般的に、ネットワークを含むI/O操作はCPUを遊ばせます) この時代にmod_deflateが使えない鯖の方が少ないと思うので、出来る事ならばやっておいた方が良いでしょう。 良くある間違った例 以下の様な例が良くヒットしますが、間違っ
ブラウザに表示するためのデータ転送の際、その内容を圧縮することで転送量を減らし、表示速度を高めるための手法としてgzip圧縮があります。今回はこの方法を解説します。例えば、当ブログの各ページはgzip圧縮に対応していて、本来なら25kbほどのファイルサイズが4kbほどにまで軽量化されています。 「gzip」とは、ファイルを「圧縮」する方法の1つです。圧縮というのは、独自のデータ形式でファイルサイズを一時的に小さくすること。つまり、ウェブページのサーバーとユーザーのパソコン間で通信しているデータサイズを少なくするのが、今回設定する「gzip圧縮」の効果なんです。サイズが小さくなることで、ページの表示がより高速になることはもちろん、転送量が減るので利用しているサーバによっては、料金の節約にも繋がります。 技術的・専門的な内容については、下記の、t32kさんのページが分かりやすいので、興味のある
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く