- 締切済み
バイナリファイルをダウンロードできなくなりました。
バイナリファイルをダウンロードできなくなりました。 以下のように、fopen で取得したバイナリデータをブラウザにダウンロードさせていましたが、ある時からダウンロードできなくなりました。 ・プログラムコードは変更していません。 ・同様の処理をしている全ての箇所が失敗するようになりました。 ・いずれも、かつては正常に動作していました。 ・ApacheやPHPはエラーメッセージを出力していません。 Apacheの設定またはPHPの設定を変えてしまったのかな、と推測していますが、原因がつかめていません。 検討がつかないので困っています。推測できる原因をご提示ください。 [環境] CentOS 5.3 (ルート権限も持っている、完全にコントロールできる環境です) PHP 5.1.6 Apache 2.2.3 [問題のコード その1] $ret=''; $handle = @fopen($file_name, 'r'); if ($handle) { while (!feof($handle)) $ret.=fread($handle, 8192); fclose($handle); } header('Content-disposition: attachment; filename="'.$src.'"'); header('Content-type: audio/3gpp'); header('Cache-Control: private'); header('x-jphone-copyright: no-transfer'); die($ret); [問題のコード その2] $url = "http://chart.apis.google.com/chart?".http_build_query($query); $img = @imagecreatefrompng($urls); $img = @imagerotate($img,270,0); header('Content-Type: image/jpeg'); imagejpeg($img); [問題のコード その3] $url = "http://example.net/example.php"; $options = array('http' => array( "method" => 'POST', "header" => "Content-Type: application/x-www-form-urlencoded\r\n" "content" => http_build_query($data), )); $contents = @file_get_contents($url, false, stream_context_create($options)); //書きだし header('Content-Type: application/x-shockwave-flash'); header('Content-Length: '.strlen($contents)); print $contents;
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- BellBell
- ベストアンサー率54% (327/598)
>プログラムコードは変更していません。 ってのが、『これらの部分は変更していません』って意味なのか、本当にまったく変更していないのか。 error_reporting(E_ALL); とかで、すべてのエラーメッセージ表示するようにしてみれば原因が掴めるかも知れません。 なんとなく、どこかで何らかの出力(広告など)を追加したせいで、 header で『既に本文が出力されています』エラー(正確にはワーニングだったかな)が発生しているというのが濃厚ではないかという気がしなくもありませんが。
そのバイナリファイル(またはURL)が、ブラウザないしはセキュリティ対策ソフトの拒否リストに入ってしまったのではないでしょうか。 ご確認下さい。
お礼
ご回答ありがとうございます。 die(header('Location: …')); という風にリダイレクトさせると表示できるので、ファイルやURLに問題はありません。 そして、このサイトはモバイル向けなので、セキュリティソフトが急に追加されたようなこともありません。
補足
文中に書き損じがありました。訂正します。 誤) $img = @imagecreatefrompng($urls); 正) $img = @imagecreatefrompng($url); 投稿するためにコードを整理した際に書き損じました。 これが今回のトラブルの原因ではありません。 よろしくお願いします。
補足
>『これらの部分は変更していません』って意味なのか、本当にまったく変更していないのか。 「本当にまったく変更していない」です。 >error_reporting(E_ALL); もともとこうしています。 headerを先んじて出力している、という線は、Apacheの設定であり得ますね。 一応もう一度チェックしてみたいと思います。