July 19, 2022 • ☕️ 2 min read
【 環境 】
Laravel のバージョン: 8.61.1
PHP のバージョン: 8.0.16
MySQL のバージョン: 5.7.32
ダウンロード処理の途中に、echo や var_dump 等の標準出力処理があった場合、正常に動かなくなる事があるみたいです。
例えば、こんなコードがあったとします。
Route::get('fileDownloadAction01/', [FileDownloadController::class, 'fileDownloadAction01']);
class FileDownloadController extends Controller
{
public function fileDownloadAction01(Request $request)
{
$filePath = 'PdfFile01.pdf';
$fileName = 'fileDownloadAction01' . '_' . Carbon::now('UTC')->format('YmdHisu');
$headers = [
'Content-Type' => 'application/pdf'
];
return Storage::download($filePath, $fileName, $headers);
}
}
上記のコードは、ブラウザから fileDownloadAction01 にアクセスすると、ストレージに保存されているファイル「PdfFile01.pdf」をダウンロードする処理です。
ですが、以下のように標準出力の処理を追加すると、正常に動かなくなります。
class FileDownloadController extends Controller
{
public function fileDownloadAction01(Request $request)
{
$filePath = 'PdfFile01.pdf';
$fileName = 'fileDownloadAction01' . '_' . Carbon::now('UTC')->format('YmdHisu');
$headers = [
'Content-Type' => 'application/pdf'
];
// 何かしらのメッセージを表示する
echo "{$downloadTargetFile}";
return Storage::download($filePath, $fileName, $headers);
}
}
上記のコードでは echo を使用しましたが、var_dump でも同様の結果となります。
ダウンロード処理を記述する場合、標準出力の処理を記述しない。
実際に書いたコードでは、ファイルを作成する処理を外部APIサービスを使っていたり、リポジトリパターンの構成にしてサービス層にロジックを書いていたりしたので、原因の究明には凄まじく時間がかかりました。
「あれ?何で動かないんだろ。とりあえず途中経過の内容を echo で出力して状況を見てみるか」
といった感じで原因を突き止めようとすると、原因究明のために書いたコードが原因で正常に動かなくなるという、何ともタチの悪い状況が生まれたりします。
とはいえ、標準出力処理を挟むとこういう結果になるのかまでは調べきれていないので、分かったら追記します。