header で Content-type を指定しても、画像が表示されない - PHPプロ!Q&A掲示板

642

  • 0P

header で Content-type を指定しても、画像が表示されない

質問日時 / 2007年9月12日 02:56    回答数 / 6件

Questioner:  tsingtao  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

実行環境は、
PHP 5.2.4
Apache 2.0.59
です。

画像のパスを直接表示させるのではなく、PHP ファイル経由で画像を表示したいと考えています。
しかし、画像は表示されません。その代わりに、ブラウザ(Firefox)には、PHPスクリプトの実行
URLが表示されています。

表示されたページを保存して、保存したファイルの拡張子を「.php」から「.jpg」と変更すると
画像として表示されます。

  1. <?php
  2. $size = filesize("test.jpg");
  3. $fp = fopen("test.jpg""rb");
  4. if ($fp !== false) {
  5.   $img = fread($fp$size);
  6.   fclose($fp);
  7.   header("Content-Length: $size");
  8.   header("Content-type: image/jpeg");
  9.   print $img;
  10.   exit();
  11. }
  12. ?>

また、開発環境ではなく、実行環境用のサーバーで実行をしてみたところ、実行環境下のサーバーで「Warning: Cannot modify header information - headers already sent by (output started at /var/www/home/public_html//test/index.php:1) in /var/www/home/public_html/test/index.php on line 1」というエラーが表示されます。

エラーが発生している行は、「<?php」としか入力しておらず、何も出力をしていません。

どうしたら、普通に表示されるようになるでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01kaitauこんばんは。 症状を見るに、やはり画像データを出
┃┗A01-1tsingtao返信ありがとうございます。 画像のサイズと読み込み
┣A02TorrySegallこの意見は投稿者によって削除されました。
┣A03TorrySegall開発環境・実行環境と、2台のサーバで共通して失敗し
┃┣A03-1tsingtao返信ありがとうございます。 やはり自分も文字コー
┃┗A03-2tsingtaoこの意見は質問者によって削除されました。
┣A04tsingtao一応、意図していた結果を得られるようになりましたの
┗A05tsingtaoTorrySegall さんの意見の通り、 > 『スクリプトフ

回答一覧

並び替え:

A01 参考になった
answererkaitau [9月12日 19:18]

こんばんは。

症状を見るに、やはり画像データを出力する前に何かしらの出力が行われていて、
それによって画像が壊れている疑いが濃厚です。

apacheのアクセスログが出力時の応答サイズを設定(カスタムログ設定で%bオプション)
するようにしていれば、PHPが出力しているデータのサイズを確認してください。
正常な画像出力の処理であれば、これは読み込んでいる画像ファイルのサイズと同じになります。

もしこの値が違うようなら、事前に読み込んでいるライブラリなど含めて、改めて探すしか
ないでしょう。
あまり無いことだとは思いますが、php.ini(若しくはその設定を上書きしているhttpd.confなど)の
auto_prepend_file に何かしら設定していて、そこが悪さをしているかもしれません。

サイズに変わりがなかったら・・・ごめんなさいわかりません。

この意見に回答する

ツリーへ TOPへ

A01-1
replyertsingtao [9月14日 11:18]

返信ありがとうございます。
画像のサイズと読み込みもとの画像サイズは一緒でした。

ただ、同様の現象が起きたときの確認すべき設定箇所がわかり、
参考になりました。

この意見に回答する

ツリーへ TOPへ

A02
answererTorrySegall [9月12日 23:05]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A03 参考になった
answererTorrySegall [9月13日 07:26]

開発環境・実行環境と、2台のサーバで共通して失敗しているのですから
サーバ設定周りの問題ではないような気がします。

ということで、私が御質問を読んで最初に疑ったのは
『スクリプトファイルの保存エンコードが BOM付きUTF-8 になっていないか』
です。
この場合、ファイルの先頭にエディタでは表示されない3バイトが付きますので
それが最初に(1行目に記述されたデータとして)出力されてしまい、
スクリプト中の header 関数は失敗します。

ただ、

 実行環境が吐いたWarningを、なぜ開発環境は吐かなかったか?

 >拡張子を「.php」から「.jpg」と変更すると表示される
 とあるが、この場合BOMの3バイトは本当にブラウザが無視してくれるのか?

このへんの事情を知らない・分からないので、回答への自信は『かなり薄』です…

この意見に回答する

ツリーへ TOPへ

A03-1
replyertsingtao [9月14日 11:20]

返信ありがとうございます。

やはり自分も文字コードや改行コードの形式が怪しいと思い、
改行形式を複数試してみたり、スクリプトの改行を削除して
1行にまとめてみたりしてみましたが、結果は変わりませんでした。

ただ、マルチバイトを扱う際の文字コード周りは、こういうときでも
振り回されることがわかり、とても参考になりました。

この意見に回答する

ツリーへ TOPへ

A03-2
replyertsingtao [9月14日 11:32]

この意見は質問者によって削除されました。

ツリーへ TOPへ

A04
answerertsingtao [9月14日 11:33]

一応、意図していた結果を得られるようになりましたので、報告します。
下記のように変更をしたら、正常に表示されるようになりました。

  1. $image_file = 'test.jpg';
  2. if (file_exists($image_file)) {
  3.   $size = filesize($image_file);
  4.   header("Content-Length: $size");
  5.   header("Content-type: image/jpeg");
  6.   // 画像の出力関数と画像のフルパスを設定してみた
  7.   readfile("D:/xampp/htdocs/test/${$image_file}");
  8. }

1日ほど時間をかけて試した結果、使用した関数が適切ではなかったのか、
画像のパスの設定だったのかまで問題の切り分けではできていませんが…。

この意見に回答する

ツリーへ TOPへ

A05
answerertsingtao [9月14日 12:24]

TorrySegall さんの意見の通り、

> 『スクリプトファイルの保存エンコードが BOM付きUTF-8 になっていないか』です。
> この場合、ファイルの先頭にエディタでは表示されない3バイトが付きますので
> それが最初に(1行目に記述されたデータとして)出力されてしまい、スクリプト中
> の header 関数は失敗します。

該当するスクリプト(ASCII文字のみ記述)を UTF-8 から他の文字コードに変換した際に、
ファイルの先頭行に、文字化けした文字が表示されました。

おそらく BOM付きUTF-8 になっていたからかもしれません。

まだ、すべての問題の切り分けを行っていないので、なんとも言えませんが、
文字コードが原因だったのかもしれません。

どうもありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報