読者です 読者をやめる 読者になる 読者になる

PHP経由でダウンロードしたファイルが壊れてしまう

現象

PHPを経由してダウンロードさせたファイルが壊れてしまう

原因

PHPないからファイルを出力する際に出力バッファに残ったゴミが一緒に出力されてしまい、結果ファイルが壊れてしまう

対策

出力バッファの中に残ったゴミが問題なので、ファイルの中身を出力する前にob_end_clean()を使って出力バッファの中身をクリアすれば良い

未対策の例

<?php
    // 前略
    header('Content-Type: application/octet-stream');

    // ファイルの内容を出力する
    readfile($path, FILE_BINARY);
    exit;

対策例

<?php
    // 前略
    header('Content-Type: application/octet-stream');

    // ファイルの内容を出力する前に入力バッファの中身をクリアする
    ob_end_clean(); 
    readfile($path, FILE_BINARY);
    exit;

参考