- ベストアンサー
PDFダウンロードでPDFが壊れてしまう現象の解決方法
- PHPからのPDFダウンロードでPDFが壊れてしまうという現象が顧客環境で発生しています。サーバー側の設定に問題がある可能性があります。
- 問題は特定のPDFファイルにのみ発生しており、MacOSやiPhoneからの接続では問題なく閲覧できます。
- Apacheの設定を見直すことで問題が解決する可能性があります。具体的な解決方法については詳細な情報が必要です。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
たとえばこんな感じ <?PHP $filepath="hogehoge.pdf"; $file_name="fugafuga.pdf"; header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"{$file_name}\""); header("Content-Length: ".filesize($filepath)); $fp=fopen($filepath,"r"); while (!feof($fp)) { print fread($fp,1024); } fclose($fp); exit;
その他の回答 (5)
- muuming2001
- ベストアンサー率23% (202/847)
BOM付きUTF-8で書かれてるとか? そうであれば全部の場合で失敗すると推測されるから違うか・・・
お礼
ご連絡ありがとうございました。 BOM付きUTF-8ではなかったです。ささいなことでもご指摘頂きありがとうございます。 yambejp様提供のソースで問題なくダウンロードできました。 バイナリセーフではなかったことが原因のようでした。 ありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
>正常にできるPDFとできないPDFでは何が異なるのでしょうか? なんでしょうね? とりあえずファイルサイズが一緒だというのであれば WindowsのFCコマンドなどでバイナリベースで比較をして 本当に完全に一致しているか確認するところからでしょうね。 また別解にもあったようにバイナリエディタで開き 特に先頭あたりにゴミがついていないかを見てみるとよいかもしれません。 header関数のContent-Lengthをコメントアウトすると、ファイルサイズが 変わるようであれば、ファイルの入出力のロジックに問題があるかも
お礼
ご連絡ありがとうございました。 ご提供のソースで問題なくダウンロードできました。 ご指摘通り、バイナリセーフではなかったことが原因のようでした。 ありがとうございました。
PHPの関数でバイナリセーフではないものと言えば「ファイル名」を扱う場所だけだと思います。読み取り対象データはereg、ereg_replaceなどの関数を除けばバイナリセーフであったはずです。 壊れたファイルをエディタで見てみると何か分かるかもしれません。バイナリデータの中にエラーメッセージが混入している可能性はあります。
バイナリセーフでないとはこういうことですね。 http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html 要は$filepathにNULLバイトが入ってるとマズいということです。 (そんなこと早々ないと思いますが) 但し$filepathをユーザーから受け取る場合はフィルタリングが必ず必要です。
お礼
ご連絡ありがとうございました。 yambejp様提供のソースで問題なくダウンロードできました。 ご指摘通り、バイナリセーフではなかったことが原因のようでした。 ありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
>PDFが壊れている の状態次第ですね ・大幅にファイルサイズが大きい(小さい) ・微妙にファイルサイズが大きい(小さい) どんな感じなのでしょうか? readfileはバイナリセーフではないので、きちんとしたファイルI/Oで 開いて読んで出力してみてはいかがでしょうか?
お礼
早速のご回答ありがとうございます。 ファイルサイズにつきましては、まったく同じです。 > readfileはバイナリセーフではないので、きちんとしたファイルI/Oで > 開いて読んで出力してみてはいかがでしょうか? とは、 file_put_contents() を利用した方が良いということでしょうか?
お礼
ご丁寧にソースをご提供頂きありがとうございます。 確認させて頂きたいと思います。 ちなみに、大変申し訳ございませんがもしご存じであれば教えて頂きたいのですが、 アップロード・ダウンロードが正常にできるPDFとできないPDFでは何が異なるのでしょうか? できるPDFは何度試してもできますし、 できないPDFは何度試してもできません。 PDFを作成する際の環境(バージョン等?)に左右されるのでしょうか?