
お世話になってます。
PHPからのPDFダウンロードで以下の様な現象が起きておりまして、
助言を頂きたいと思います。
管理者ページからPDFを添付してお知らせを入力し、
一般ユーザはお知らせを見たりPDFをダウンロードしたりする機能があります。
開発機では、まったく問題なくアップロード・ダウンロードができるのですが、
顧客環境では正常にアップロードができていることは確認ができますが、
Windows環境でダウンロードし、Acrobat Readerで確認するとPDFが壊れているという現象が起きています。
(実際にサーバーにアップロードされたファイルを確認しておりますのでアップロードは正常です。)
またそれは、全てのPDFファイルではなく1部のファイルにそのような現象が起きていて
さらには、MacOS 及び iPhoneから接続しダウンロードを行い閲覧するには問題はありません。
おそらくサーバー側のApacheのどこかに何か設定があるのかと思いますが検討がつきません。
環境は、CentOS5.9 + Apache 2.2.3
PHPのコードは、以下の通りです。
header("Cache-Control: public");
header("Pragma: public");
header("Content-Type: application/octet-stream; charset=UTF8");
header('Content-Disposition: attachment; filename="'. $file_name .'"');
header('Content-Length: ' . filesize($filepath));
readfile($filepath);
以上、どなたかお分かりのかたいらっしゃいましたら助言を頂けますでしょうか。
よろしくお願い致します。
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;
ご丁寧にソースをご提供頂きありがとうございます。
確認させて頂きたいと思います。
ちなみに、大変申し訳ございませんがもしご存じであれば教えて頂きたいのですが、
アップロード・ダウンロードが正常にできるPDFとできないPDFでは何が異なるのでしょうか?
できるPDFは何度試してもできますし、
できないPDFは何度試してもできません。
PDFを作成する際の環境(バージョン等?)に左右されるのでしょうか?
No.5
- 回答日時:
>正常にできるPDFとできないPDFでは何が異なるのでしょうか?
なんでしょうね?
とりあえずファイルサイズが一緒だというのであれば
WindowsのFCコマンドなどでバイナリベースで比較をして
本当に完全に一致しているか確認するところからでしょうね。
また別解にもあったようにバイナリエディタで開き
特に先頭あたりにゴミがついていないかを見てみるとよいかもしれません。
header関数のContent-Lengthをコメントアウトすると、ファイルサイズが
変わるようであれば、ファイルの入出力のロジックに問題があるかも
ご連絡ありがとうございました。
ご提供のソースで問題なくダウンロードできました。
ご指摘通り、バイナリセーフではなかったことが原因のようでした。
ありがとうございました。
No.4
- 回答日時:
PHPの関数でバイナリセーフではないものと言えば「ファイル名」を扱う場所だけだと思います。
読み取り対象データはereg、ereg_replaceなどの関数を除けばバイナリセーフであったはずです。壊れたファイルをエディタで見てみると何か分かるかもしれません。バイナリデータの中にエラーメッセージが混入している可能性はあります。
No.2
- 回答日時:
バイナリセーフでないとはこういうことですね。
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_se …
要は$filepathにNULLバイトが入ってるとマズいということです。
(そんなこと早々ないと思いますが)
但し$filepathをユーザーから受け取る場合はフィルタリングが必ず必要です。
ご連絡ありがとうございました。
yambejp様提供のソースで問題なくダウンロードできました。
ご指摘通り、バイナリセーフではなかったことが原因のようでした。
ありがとうございました。
No.1
- 回答日時:
>PDFが壊れている
の状態次第ですね
・大幅にファイルサイズが大きい(小さい)
・微妙にファイルサイズが大きい(小さい)
どんな感じなのでしょうか?
readfileはバイナリセーフではないので、きちんとしたファイルI/Oで
開いて読んで出力してみてはいかがでしょうか?
早速のご回答ありがとうございます。
ファイルサイズにつきましては、まったく同じです。
> readfileはバイナリセーフではないので、きちんとしたファイルI/Oで
> 開いて読んで出力してみてはいかがでしょうか?
とは、 file_put_contents() を利用した方が良いということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseでコメントアウトができ...
-
libxml2のインストール
-
ファイル一覧を表示しその画面...
-
PHPで複数ファイルのダウン...
-
PHPで複数ファイルをZIPで圧縮...
-
生成したHTMLをボタンクリック...
-
サーバー上のファイルをブラウ...
-
ダウンロードファイル名の文字...
-
PHPのif文でその処理を途中で抜...
-
データ送信をボタンを押さずに...
-
ファイルの更新日時でのソート
-
FTPコマンドでディレクトリごと...
-
【file_exists】ファイルが存在...
-
日付と年月日を選択するコード...
-
FORMで送信ボタンと戻るボタン...
-
CFileDialogの最初のディレクト...
-
インクルードした部分が表示さ...
-
makefile でファイルをコピーす...
-
php,mysqlにて画像パス保存/表...
-
Subversionのリポジトリの削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
zip圧縮の種類について
-
PHPでファイルのダウンロードす...
-
生成したHTMLをボタンクリック...
-
ファイルシステム関数関係
-
PHPで複数ファイルのダウン...
-
PDF ダウンロード
-
ダウンロードすると画像が壊れ...
-
getfile.phpファイル?について
-
パスワードファイルの管理
-
PHPでダウンロードしたファイル...
-
PHPでファイルをダウンロードさ...
-
ファイル(PDF・エクセル・ワー...
-
VB.NETのFTPダウンロードについて
-
ブラウザでExcelをダウンロード...
-
fwrite~サーバ環境で、なぜか0...
-
eclipseでコメントアウトができ...
-
検索結果をCSVにダウンロードす...
-
ダウンロードが機能しない。
-
csvをダウンロードする際、いき...
-
PHPでBasic認証付HP...
おすすめ情報