システム屋日誌

情報システム構築、開発手法を中心に気が付いたことを書き留めます。ちいさなことから、おおきなことまで。もちろん、どうでもいいことも。。。
<< August 2018 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
 
RECENT COMMENT
RECENT TRACKBACK
れいねっとHP
http://www.rey-net.com
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
amazon WebサービスをPHPで使って、本の画像表示
昨日は眠くてダメダメモード。でも、今夜は元気モード。amazon Webサービスを呼び出して、イメージを表示するPHPプログラムも無事完成。さっそく、このブログに貼り付けてみました。



上記のタグは、<img src='http://www.rey-net.com/amazon/amazon_img.php?ASIN=4834001830' />って書いてあります。

なぜ、昨日は動かなかったかというと。PHPがサーバからクライアント側にイメージではなく「文字」返していたから。ストリームにイメージを流すためには、PHPの処理冒頭で「これから、イメージを流しますよ」と宣言する必要があります(コンテントネゴシエーション)。そのためには、以下の手順が必要です。

1、ストリームの種類(content type)をイメージにする
 header("Content-Type: image/jpeg");
 上記は、PHPのメイン処理の冒頭で、jpegイメージをストリームに
 流すと宣言しています。
2、イメージ関数(image)を使う
 imagecreatefromjpeg() および imagejpeg()
 ただし、これらは jpeg 用なので、他の種類のイメージファイルに
 関してはPHPマニュアルをご覧下さい。

参考URL
(PHPリファレンス LXIII. イメージ関数(image))
http://jp2.php.net/manual/ja/function.imagecreatefromjpeg.php
(Apache公式サイト コンテントネゴシエーション)
http://httpd.apache.org/docs/2.0/ja/content-negotiation.html

以下、PHPサンプルコードです。
表示の問題で、半角大文字が入っています。EUC で保存します。
<?php

// for PHP Version 4.3.11

function LoadJpeg($imgname)
{
 $im = @imagecreatefromjpeg($imgname);        // オープンを試みます。エラーは@でスキップ
 if (!$im) {                     // 失敗したかどうかを調べます
  $im = imagecreatetruecolor(150, 30);       // 空の画像を作成します
  $bgc = imagecolorallocate($im, 255, 255, 255);
  $tc = imagecolorallocate($im, 0, 0, 0);
  imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
  imagestring($im, 1, 5, 5, "No Image", $tc);    // エラーメッセージ出力
 }
 return $im;
}
header("Content-Type: image/jpeg");

$RSSURL = "http://xml-jp.amznxslt.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=【SubscriptionID】&Operation=ItemLookup&ItemId=".$_GET['ASIN']."&ResponseGroup=Accessories,EditorialReview,Images,ItemAttributes"; // RDF

 if(! $dom = domxml_open_file($RSSURL)) {
  exit;                          // RSS ファイルが見つからない場合、exit
 }
 $root = $dom -> document_element();            // ルートエレメント取得

 $items = $root -> get_elements_by_tagname('MediumImage'); // 中型イメージ

 foreach($items as $item) {

  $nodes = $item -> child_nodes();           // MediumImageタグ内の子ノード
 
  foreach($nodes as $node) {

   if ($node -> node_type() == XML_ELEMENT_NODE) {  // ノードの種類がエレメント
    
    switch($node -> tagname()) {           // タグ名から変数に代入
     case 'URL':
      $imgurl = $node -> get_content();      // イメージの URL をセット
      break;
    }
   }
  }
 } // foreach

$img = LoadJpeg($imgurl);
imagejpeg($img);

?>
コメント
コメントする









 
トラックバック
この記事のトラックバックURL
http://technology.rey-net.com/trackback/481038