• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PDF ダウンロード)

PDFダウンロードでPDFが壊れてしまう現象の解決方法

このQ&Aのポイント
  • PHPからのPDFダウンロードでPDFが壊れてしまうという現象が顧客環境で発生しています。サーバー側の設定に問題がある可能性があります。
  • 問題は特定のPDFファイルにのみ発生しており、MacOSやiPhoneからの接続では問題なく閲覧できます。
  • Apacheの設定を見直すことで問題が解決する可能性があります。具体的な解決方法については詳細な情報が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

たとえばこんな感じ <?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;

sadoru
質問者

お礼

ご丁寧にソースをご提供頂きありがとうございます。 確認させて頂きたいと思います。 ちなみに、大変申し訳ございませんがもしご存じであれば教えて頂きたいのですが、 アップロード・ダウンロードが正常にできるPDFとできないPDFでは何が異なるのでしょうか? できるPDFは何度試してもできますし、 できないPDFは何度試してもできません。 PDFを作成する際の環境(バージョン等?)に左右されるのでしょうか?

その他の回答 (5)

回答No.6

BOM付きUTF-8で書かれてるとか? そうであれば全部の場合で失敗すると推測されるから違うか・・・

sadoru
質問者

お礼

ご連絡ありがとうございました。 BOM付きUTF-8ではなかったです。ささいなことでもご指摘頂きありがとうございます。 yambejp様提供のソースで問題なくダウンロードできました。 バイナリセーフではなかったことが原因のようでした。 ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

>正常にできるPDFとできないPDFでは何が異なるのでしょうか? なんでしょうね? とりあえずファイルサイズが一緒だというのであれば WindowsのFCコマンドなどでバイナリベースで比較をして 本当に完全に一致しているか確認するところからでしょうね。 また別解にもあったようにバイナリエディタで開き 特に先頭あたりにゴミがついていないかを見てみるとよいかもしれません。 header関数のContent-Lengthをコメントアウトすると、ファイルサイズが 変わるようであれば、ファイルの入出力のロジックに問題があるかも

sadoru
質問者

お礼

ご連絡ありがとうございました。 ご提供のソースで問題なくダウンロードできました。 ご指摘通り、バイナリセーフではなかったことが原因のようでした。 ありがとうございました。

noname#244856
noname#244856
回答No.4

PHPの関数でバイナリセーフではないものと言えば「ファイル名」を扱う場所だけだと思います。読み取り対象データはereg、ereg_replaceなどの関数を除けばバイナリセーフであったはずです。 壊れたファイルをエディタで見てみると何か分かるかもしれません。バイナリデータの中にエラーメッセージが混入している可能性はあります。

noname#244856
noname#244856
回答No.2

バイナリセーフでないとはこういうことですね。 http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html 要は$filepathにNULLバイトが入ってるとマズいということです。 (そんなこと早々ないと思いますが) 但し$filepathをユーザーから受け取る場合はフィルタリングが必ず必要です。

sadoru
質問者

お礼

ご連絡ありがとうございました。 yambejp様提供のソースで問題なくダウンロードできました。 ご指摘通り、バイナリセーフではなかったことが原因のようでした。 ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>PDFが壊れている の状態次第ですね ・大幅にファイルサイズが大きい(小さい) ・微妙にファイルサイズが大きい(小さい) どんな感じなのでしょうか? readfileはバイナリセーフではないので、きちんとしたファイルI/Oで 開いて読んで出力してみてはいかがでしょうか?

sadoru
質問者

お礼

早速のご回答ありがとうございます。 ファイルサイズにつきましては、まったく同じです。 > readfileはバイナリセーフではないので、きちんとしたファイルI/Oで > 開いて読んで出力してみてはいかがでしょうか? とは、 file_put_contents() を利用した方が良いということでしょうか?

関連するQ&A