
お世話になってます。
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で質問しましょう!
似たような質問が見つかりました
- PDF Adobe Acrobat Reader について 3 2023/02/24 20:19
- その他(IT・Webサービス) WPからダウンロードしたファイル名を指定したい 2 2022/04/08 08:31
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Android(アンドロイド) oppo Reno3AのクロームでダウンロードできないPDFがあります 1 2022/08/10 20:20
- その他(IT・Webサービス) WEBサイト内のファイルを探す方法は? 1 2022/11/11 16:38
- PDF PDF印刷後に「変更を保存しますか?」と訊かれる 2 2023/04/28 17:35
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- その他(クラウドサービス・オンラインストレージ) iPadとクラウドの同期はできないですか? 1 2022/05/21 09:34
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
生成したHTMLをボタンクリック...
-
複数ダウンロードさせるプログ...
-
CSVファイルをダウンロード時の...
-
getfile.phpファイル?について
-
パスワードファイルの管理
-
ダウンロードダイアログなしで...
-
ftpを使ってphpで書く
-
fwrite~サーバ環境で、なぜか0...
-
zip圧縮の種類について
-
指定したURLからファイル(PDF...
-
eclipseでコメントアウトができ...
-
FTPコマンドでディレクトリごと...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
-
X-ServerにSmartyをインストー...
-
「旭日中綬賞 」とはどんな賞で...
-
自分で書いた.htaccess添削して...
-
filemtimeについて
-
ポータルサイト構築
-
windowsXPでのphpとmySQLの導入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ftp_getでローカルにファイルが...
-
zip圧縮の種類について
-
PHPでファイルのダウンロードす...
-
libxml2のインストール
-
PHPで複数ファイルのダウン...
-
生成したHTMLをボタンクリック...
-
ファイルのダウンロードのイベ...
-
VB.NETのFTPダウンロードについて
-
phpでzipファイルダウンロード...
-
PHPでダウンロードしたファイル...
-
複数ファイルを連続でダウンロード
-
eclipseでコメントアウトができ...
-
Excelファイルをダウンロード
-
ファイルに書き込む時の負荷に...
-
CSVファイルのダウンロード
-
ファイル一覧を表示しその画面...
-
ファイルアップロード・ダウン...
-
phpでEXCELファイルの編集
-
PDF ダウンロード
-
ダウンロードファイル名の文字...
おすすめ情報