PHPを使ってHTMLで画像表示させるようにしたいのですが・・・

PHP側は、どのような記述にしたよいのでしょうか?
例えば、こんなファイルなのですが・・・
http://chartpark.net/wti-dow.php

このPHPの内側のプログラムはどんな形になっているのでしょうか?
自分でも同じように画像を呼び込みたいのですが、その記述がどうして良いか分からず困っています^^;

回答の条件
  • 1人10回まで
  • 登録:2009/04/17 08:51:28
  • 終了:2009/04/17 22:03:12

ベストアンサー

id:pahoo No.6

pahoo回答回数5960ベストアンサー獲得回数6332009/04/17 21:30:29

ポイント150pt

コメント欄に書き込めないので、回答欄にて返信します。


まずは、問題が解決したようで何よりです。

はてなポイント以外のお礼は不要です。解決したことが何よりの報酬ですので。


また、今回は Chunked形式で送られてくるバイナリデータの実例を見ることができたので、私としても勉強になりました。

ただし、お示ししたコードは完全なものではない(たとえば、すべてのChunked形式に対応していない)ので、ご注意下さい。いずれ、自サイトで完全版を紹介しようと思います。

その意味でも、今回は、はてなポイントだけ頂ければ十分です。


それでは、また。

id:idetuyo

そうでしたか^^;

感謝の気持ちとしてお礼したかったのですが了解いたしました^^

またデータが参考なられたという事で何よりです。

また完全でないということは了解いたしました。

本当にありがとうございます。

またご紹介のサイトの方を拝見させて頂きますね。

では、今後とも何とぞ宜しくお願いいたします。

2009/04/17 22:01:50

その他の回答(5件)

id:GoldenDawn No.1

GoldenDawn回答回数426ベストアンサー獲得回数812009/04/17 09:37:28

ポイント50pt

他から既存の画像を読み込む場合の例。

<?php
$img_path = 'http://q.hatena.ne.jp/images/logo_hatena.gif' ;
$img = file_get_contents($img_path) ;

header('Content-type: image/gif') ;
echo $img ;
?>

自分で画像を作る場合の例 (要 GD 関数)

<?php
$img = imagecreatetruecolor(300, 300) ;
imagefill($img, 0, 0, 0xffffff) ;
imagefilledrectangle($img, 50, 50, 250, 250, 0xff0000) ;

header('Content-type: image/png') ;
imagepng($img) ;
?>

http://q.hatena.ne.jp

id:idetuyo

ありがとうございます!

私の場合は、外部から画像を読み込むので上の記述の形になりますが

$img_path = 'http://q.hatena.ne.jp/images/logo_hatena.gif' ;

$img = file_get_contents($img_path) ;

header('Content-type: image/gif') ;

echo $img ;

?>

この記述のPHPファイルを生成してサーバーにアップロードしたのですが

うまくいきませんでした^^;

phpプログラムも、HTMLと同じように<body>タグのように前後のタグを生成する必要があるのでしょうか?

全くPHPを利用した事がなくてどうしたら良いかもわからない状態です^^;

おそらくサーバー側でもPHPを利用するならば、パーミッション設定や

PHPのインストールなどをしなければならないような

気がしているのですが・・・

初歩的なことですみません。

2009/04/17 10:19:50
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/04/17 10:29:10

ポイント100pt

コメント欄に書き込めないので、回答欄にて確認することをお許しください。

この記述のPHPファイルを生成してサーバーにアップロードしたのですが

うまくいきませんでした^^;

どのように、うまくいかなかったのでしょうか。

以下の点をお知らせください。


  1. うまくいかなかったということですが、どんなエラーメッセージは表示されましたか? それとも、PHPソースプログラムそのものが表示されましたか?
  2. そのサーバはPHPを利用できますか?
  3. PHPを利用できるディレクトリが制限されていませんか?
  4. 利用できるPHPのバージョンは何ですか?

URLはダミーです。 http://q.hatena.ne.jp/

id:idetuyo

ありがとうございます。

具体的なご質問でとても助かります!

下記のようなエラーメッセージが出ています。

Warning: file_get_contents(http://q.hatena.ne.jp/images/logo_hatena.gif ) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php:4) in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 6


サーバーは、PHPが利用できます。

以下のバージョンが利用可能のようですPHP3/4/5

またサーバーのファイルのパーミッションは

705になっております。

3.PHPを利用できるディレクトリが制限されていませんか?

これについては、どのような意味か良く理解できていないのですが

パーミッションの設定という事でしょうか?

サーバーの利用環境は、このような形となっております。

●ディスクスペース:50~300メガバイト(申請制)・複数アカウント可

●CGI/SSI(Perl・Ruby・Python・C・PHP3/4/5)が利用可能

●データベースが利用可能(MySQL/PostgreSQL)

●SSH(TELNET代替)が使用可能

●安全な通信:SSL対応(当社ドメインの正式証明書使用)

●パスワード制限可能:.htaccess利用可能

●サーバーログ統計が閲覧可能:参照元・アクセス回数などがわかる

2009/04/17 10:38:30
id:pahoo No.3

pahoo回答回数5960ベストアンサー獲得回数6332009/04/17 11:23:32

ポイント100pt

エラー情報をありがとうございます。

対策を記します。


1.allow_url_fopenの問題

以下のスクリプトを実行してください。

<?php
phpinfo();
?>

ブラウザの画面に php の設定情報が表示されます。

Configuration - PHP Core - allow_url_fopen の値が On になっていますか?

もし Off になっているとすると、関数 file_get_contents を使って外部サーバのデータを読み込むことができません。Onにするためにはサーバ管理者権限が必要ですので、サーバ管理者にご相談ください。


2.HTTPヘッダの問題

次に、そのサーバは自動的に広告を表示したり、アクセス情報収集をしていませんか?

エラーメッセージから推測すると、PHPスクリプトとは別にHTTPヘッダを送信しているようです。

もしそうだとすると、読み込んだ画像をそのまま表示させるのは困難です。

この点についてもサーバ管理者にご確認ください。


代替案

以上2点の問題がクリアされない場合の代替案として、単純にHTMLを発生させているだけですが、下記をご紹介します。

<?php
$img = 'http://www.hatena.ne.jp/users/pa/pahoo/profile.gif';  //表示させたい画像

echo <<< EOF
<html>
<body>
<img src="$img" />
</body>
</html>

EOF;
?>
id:idetuyo

pahooさま

ご丁寧にありがとうございます。

早速、導入してみました。

http://www.w-stock.biz/test.php

どうやらallow_url_fopenはOnになっています。

こちらは、問題ないようです。

また2についてですが・・・

有料のサーバーを利用しておりますので、自動的に広告が出る事はないです。

またアクセス解析は別に忍者ツールを導入しておりますので、アクセス解析のジャバスクリプトの

ソースを貼り付けているだけです。

HTTPヘッダーの送信しているかもしれない点については

どのような事なのかまだ理解できておりませんが

ただ今、状況を学習中です。

ありがとうございます。

サーバー側にも障害や問題がないか確認してみます。

また大体案での画像表示はできたのですが

目的としているチャート図を外部から引っ張ってくる事については

現状のHTMLで直接画像表示させているのと同じ形のようですね^^;

どうやらサイトのURLがチャート提供会社から嫌われているみたいなので

PHPでローカルから引っ張った画像を表示させたいと思っております。

アクセスが多いサイトなので、恐らくHTML上に直接表示させていたのでは

おそらく負荷が多くなっていた為に、URLがチャート提供会社から

嫌われているのではないかと思います。

なんとかphpにして画像を表示させられるようにしたいと考えています。

以下のサイトで同じデータの引き出し先から

HTML直接リンクにより画像が引き出せなくなりました^^;

なんとかこの状況を打開すべくPHPファイルでの画像引き出しが

良いだろうと考えております。

2009/04/17 11:49:41
id:pahoo No.4

pahoo回答回数5960ベストアンサー獲得回数6332009/04/17 16:44:33

ポイント120pt

ということは、GoldenDawn さんが示した1番目のスクリプトは、エラーが出ずに実行できているということですか?


下記のスクリプトに何の手も加えず(JavaScriptを追加することなどせずに、$infnameのURLも変更せずに)実行した場合に、エラーは出ますか?

<?php
$infname = 'http://www.hatena.ne.jp/users/pa/pahoo/profile.gif';
$infp = fopen($infname, 'rb');
$img = '';
while (($ss = fread($infp, 10000)) != FALSE) {
    $img .= $ss;
}
fclose($infp);

header('Content-type: image/gif') ;
echo $img;
?> 
id:idetuyo

いえ、GoldenDawn さんが示した1番目のスクリプトは、エラーが出ます。

以下のようなエラーメッセージです。

Warning: file_get_contents(http://www.hatena.ne.jp/users/pa/pahoo/profile.gif ) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 4 

Warning: Cannot modify header information - headers already sent by (output started at /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php:4) in /virtual/w-stock/public_html/www.w-stock.biz/cmechart1.php on line 6

しかし、pahooさんの提案してくださった

代替案はエラーは出ずに表示されます。

そして、今ご紹介いただいたスクリプトもエラーは出ません。

http://www.w-stock.biz/cmechart3.php

しかしながら・・・

この動作ならばと思って、http://www.hatena.ne.jp/users/pa/pahoo/profile.gif この部分を表示させたいチャート図のURLに変更してみた所、これはエラーが出てしまいます^^;

以下のようなエラーメッセージです。

Warning: fopen(http://charts.quote.com/ifs/ifs?cont=NKD+1%21&period=V&varminute...) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.0 500 Internal Server Error in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 3

Warning: fread(): supplied argument is not a valid stream resource in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 5

Warning: fclose(): supplied argument is not a valid stream resource in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 8

Warning: Cannot modify header information - headers already sent by (output started at /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php:3) in /virtual/w-stock/public_html/www.w-stock.biz/cmechart4.php on line 10


挿入したいURLになんらかなの問題があるのかもしれませんが直リンクだと表示されるので、なぜ、これで表示できないのか不思議でなりません。

これは参考になるかわかりませんが、同じチャートをうまく表示させる事に成功しています。

pngファイルからの引き出しになっているみたいですが・・・う~ん。

ご親切にご検討くださり本当に感謝しております。

2009/04/17 17:01:57
id:pahoo No.5

pahoo回答回数5960ベストアンサー獲得回数6332009/04/17 18:47:25

ポイント150pt

件のサイトを調べてみると、User-Agentを求めることと、画像データ本体がChunked形式で送信されていることが分かりました。

そこで、関数 fsockopen を使って、以下のようなスクリプトを組み立ててみました。

<?php
$type = 'Content-type: image/png';   //画像データのMIME-type
$host = 'charts.quote.com';          //目的のホスト
$path = '/ifs/ifs?cont=NKD+1%21&period=V&varminutes=5&size=560x384&bartype=CANDLE&bardensity=high&headerbackground=9,50,165&headerforeground=255,255,255&headerdatacolor=255,255,255&studyheaderbackground=9,50,165&random=7595';    //目的のパス

$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (! $fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out  = "GET $path HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "User-Agent: Mozilla/5.0\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    //HTTPヘッダを読み飛ばす
    while (! feof($fp)) { 
        $headers = fgets($fp, 8192);
        if (trim($headers) == '') { 
            break; 
        } 
    } 
    //画像を読み込む(chunked形式)
    $img = '';   
    while (! feof($fp)) { 
        $ss = fgets($fp);
        $cnt = intval($ss, 16);
        while ($cnt > 0)  {
            $bb = fread($fp, $cnt);
            $cnt -= strlen($bb);
            $img .= $bb;
        }
        fread($fp, 2);    //\r\nをスキップ
    }
    fclose($fp);
    header($type) ;
    echo $img;
}
?> 
id:idetuyo

スクリプトを組み立ててくださったのですか(大汗)

試しに導入してみましたが・・・

なんとこれで動作するではないですか!!!!

http://www.w-stock.biz/

ばっちり表示されるようになりました。

なんとお礼を良いやら・・・

ただ今、全ての部分にこのPHPスクリプトを導入中です。

本当にありがとうございます。

はてなポイント以外に何か別途お礼をしたいのですが・・・

どのようにしたら良いのでしょうか^^;

本当に助かりました。

ありがとうございます。

2009/04/17 20:58:00
id:pahoo No.6

pahoo回答回数5960ベストアンサー獲得回数6332009/04/17 21:30:29ここでベストアンサー

ポイント150pt

コメント欄に書き込めないので、回答欄にて返信します。


まずは、問題が解決したようで何よりです。

はてなポイント以外のお礼は不要です。解決したことが何よりの報酬ですので。


また、今回は Chunked形式で送られてくるバイナリデータの実例を見ることができたので、私としても勉強になりました。

ただし、お示ししたコードは完全なものではない(たとえば、すべてのChunked形式に対応していない)ので、ご注意下さい。いずれ、自サイトで完全版を紹介しようと思います。

その意味でも、今回は、はてなポイントだけ頂ければ十分です。


それでは、また。

id:idetuyo

そうでしたか^^;

感謝の気持ちとしてお礼したかったのですが了解いたしました^^

またデータが参考なられたという事で何よりです。

また完全でないということは了解いたしました。

本当にありがとうございます。

またご紹介のサイトの方を拝見させて頂きますね。

では、今後とも何とぞ宜しくお願いいたします。

2009/04/17 22:01:50
  • id:mr_taka20002000
    回答者1の方の以下のコードが、検索で表示され、今自分にとって参考になり問題なく動作しました。
    ありがとうございました。

    他から既存の画像を読み込む場合の例。

    <?php
    $img_path = 'http://q.hatena.ne.jp/images/logo_hatena.gif' ;
    $img = file_get_contents($img_path) ;

    header('Content-type: image/gif') ;
    echo $img ;
    ?>

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません