2007年4月18日水曜日

phpの画像ファイルレスポンンス

最近phpから画像取得する必要があってちょっと研究してみた。
しかも色々と制約つき(当然っちゃー当然だけど)

概要としてやった事は以下な感じ

imggetter.php
header("Content-Type: image/png");

$imgfile = @file_get_contents($imgUrl);

if($imgfile){
  //画像判別は適宜
  if(XXXXXXX){
    //画像ファイルの処理
    $imgid = imagecreatefromstring($imgfile);
    imagepng($imgid);
    imagedestroy($imgid);
  }else{
    //エラーメッセージ処理
    ・・・
    ・・・
    ・・・
  }
}else{
  //ファイル取得失敗の処理
  ・・・
  ・・・
  ・・・
}
上からみますと

header("Content-Type: image/png");
レスポンスヘッダーにこれは画像(PNG)ファイルだと教えます。
$imgfile = @file_get_contents($imgUrl);
外部サイトにある画像をHTTPプロトコルから取得。しかもテキストで(笑
先ずは「@」の有無ですが、file操作系関数で@無しだと、エラーが発生した場合(
ファイルが取れないとか)
にブラウザにPHPエラーが表示されてしまいます。で、有りにして表示はせずに
戻り値のfalseを使って独自のエラーメッセージを出すようにさせる為にやってま
す。

そして、ここに制限があって、正常時には画像が返ってくるけど、異常時にはエ
ラーなURLから
メッセージ(コード付)のテキストが返ってくる。

if分の中
まー普通に分岐です(^^;
なので、テキストで読み込んであげないとエラーコードを取得出来ない。
ここでは省略してますが、エラー処理がやりたいのでこうしてます。
エラーコード(テキスト)とファイル無しエラーで処理を分けなければimagecreatefrompng
、imagecreatefromString
を使えば良いと思われ。

成功時にはイメージリソースIDから
imagepngで生成、imagedestroyでイメージのデータをメモリから削除してます。
イメージ生成する関数とimagedestrou関数は必ずワンセットにしないと画像デー
タがメモリに
残ってしまうらしいです。怖いですね~。

ちなみにimagepngとやるだけで、レスポンスに画像データが入り(ブラウザに表示
され)ました。

ちょっと表現が適当だけど、こんな感じ。


header部分にこんなのが書いてあった。
header("Cache-Control: no-cache, Content-Type: image/png");
Firefox 2.0 では画像が文字列データとして表示されてしまってびっくりしまし
た。
IE6.0 sp2 では表示されてたんですがね。
他のブラウザだとどうなるんだろ???
まーここらへんの考察は今回は省きます。

0 件のコメント :

コメントを投稿