かきノート

【Laravel】ダウンロード処理の途中に、echo や var_dump 等の標準出力処理があった場合、正常に動かなくなる事がある

July 19, 2022 • ☕️ 2 min read

【 環境 】
Laravel のバージョン: 8.61.1
PHP のバージョン: 8.0.16
MySQL のバージョン: 5.7.32

ダウンロード処理の途中に、echo や var_dump 等の標準出力処理があった場合、正常に動かなくなる事があるみたいです。

例えば、こんなコードがあったとします。

routes/web.php

Route::get('fileDownloadAction01/', [FileDownloadController::class, 'fileDownloadAction01']);

app/Http/Controllers/FileDownloadController.phps

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」をダウンロードする処理です。

ですが、以下のように標準出力の処理を追加すると、正常に動かなくなります。

app/Http/Controllers/FileDownloadController.phps

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 でも同様の結果となります。

x

対策

ダウンロード処理を記述する場合、標準出力の処理を記述しない。

実際に書いたコードでは、ファイルを作成する処理を外部APIサービスを使っていたり、リポジトリパターンの構成にしてサービス層にロジックを書いていたりしたので、原因の究明には凄まじく時間がかかりました。

「あれ?何で動かないんだろ。とりあえず途中経過の内容を echo で出力して状況を見てみるか」
といった感じで原因を突き止めようとすると、原因究明のために書いたコードが原因で正常に動かなくなるという、何ともタチの悪い状況が生まれたりします。

とはいえ、標準出力処理を挟むとこういう結果になるのかまでは調べきれていないので、分かったら追記します。


Relative Posts:

【Laravel】ダウンロード処理の途中に、echo や var_dump 等の標準出力処理があった場合、正常に動かなくなる事がある2

July 21, 2022

【Laravel】テストコード実行時に .env の値を参照したい場合、キャッシュの扱い方によって実行結果が変わる

March 18, 2022

福岡の物流エンジニアが、七転び八起きしたあと九回転び、寝っ転がったまま何かやってる事を垂れ流しているブログ

RotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-icon