人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL5 と PHP5 です。
あと、smarty を使用しています。
画像をMySQLに出力し、DB格納された画像をブラウザで表示したいのです。


http://q.hatena.ne.jp/1141838059
などを参考に、何とかDBには入っていると思うのですが、smarty を使った場合の画像表示の方法がわかりません。
入っていると思うというアバウトな表現は、何かしらのデータはテーブルに格納されているのですが、 MyAdmin などで画像を見ることができないためです。


まず、DBから画像データーを以下のような2次元配列に格納まで済んでおり、
$smarty->assign('image_array , $image_array);
でテンプレートに渡してあります。
smarty ではテンプレート側にどのように書けばよろしいでしょうか?
そもそも、配列を assign で普通に渡していいのかさえもわかりません。
よろしくお願いしますm(_ _)m


配列:$image_array
Array (
[0] => Array ( [image_id] => 1 [image_data] => ???????????)
[1] => Array ( [image_id] => 2 [image_data] => bacjshbvwdc) )

●質問者: seadwell
●カテゴリ:ウェブ制作
✍キーワード:DB MySQL Smarty テンプレート データ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● goodvn
●23ポイント

ブラウザで画像を表示するということは,

の2つの出力が必要です.HTML の中で,img タグを書き,この img タグで呼び出された画像を出力する必要があります.

上記の配列に入ったデータというのは,いわゆる「画像データ」にあたりますので,これを Smarty で出力するメリットはありません.

複数の画像を表示しようとされているようなので,まずは HTML の生成が必要です.これには Smarty を使いますが,画像データは必要ありません.

"image_id" で,MySQL からデータを引っ張ってこれる前提です.まずは,

"SELECT `imagetable`.`image_id` FROM `imagetable` WHERE `image_table`.`user_id` = '12345';"

という感じで,SQL を発行します.上記サンプルでは,user_id が,12345 になってる人に結びついたすべての画像の,image_id を取得しようとしています.

これを Smarty の配列処理で,

{foreach from=$image_array key=key1 item=item1}
 <img src="./imageoutput.php?image_id=key1" />
{foreach}

とします.この,imageoutput.php はまた別途作ります.中身としては,

"SELECT `imagetable`.`data` FROM `image_table` WHERE `image_table`.`image_id` = '09876';"

といった形で,image_id を使って画像を特定します.この結果(`data`カラムの中身)を,ヘッダーとともに出力します.

print "Content-type: image/jpeg\n\n";
print $data;

こちらは,Smarty は使いません.使ってもできますが,ほぼ無意味でしょう.

◎質問者からの返答

すごく噛み砕いて解説してもらっているのですが

私の理解力(スキル不足)のせいでうまくイメージできません。


チョット質問です。

php を smarty の *.tpl のなかに書いても動作しませんが

print $data; など何処に書くのですか?

imageoutput.php では image_id で画像を特定していますが

pahoo さんの回答どおり1つでないと難しいということでしょうか?

また、imageoutput.php の中身は SQL文に見えますが

最初あるテーブルが imagetable としたら、

image_table は何処からやってきたのでしょうか?


チンプンカンプンな質問かもしれませんが、どなたかお付き合いください。


2 ● pahoo
●23ポイント

画像を表示するには smarty は使いません。

image_id = 0 の画像を表示するのであれば、下記のようにします。

画像フォーマットは jpeg を想定しています。他のフォーマットなら、Content-type の部分を変更してください。

また、画像データは、DBから完全なバイナリの形で、エスケープもされていない状態で $image_array に格納されていることを想定しています。


$size = strlen($image_array[0]['image_data']);
header("Content-Length: $size");
header('Content-type: image/jpeg');
print $image_array[0]['image_data'];

なお、HTMLの性質上、DBに格納されている(変数に格納されている)画像データを、同時に複数個表示するというのは非常に困難です。

そうした目的でしたら、画像データはDBに格納せず、ファイルとしてサーバの適当なディレクトリに保存するのがよいでしょう。

◎質問者からの返答

smarty のテンプレートに複数出力することが前提なのです。

つまり、そのこと自体が困難だということですね。


3 ● goodvn
●22ポイント

ブラウザにおける画像表示というのは,HTML というファイルと,画像ファイルという,全く別のファイルを同時に表示させているだけであって,HTML の中に,直接画像データを入れるものでは無いのです.

Smarty は,HTML など,テキスト系を出力させるテンプレートエンジンですから,画像データは,PHP から直接出力してしまえばいいのです.

上記,imagetable と image_table は私の記述ミスです.すみません.同じテーブルを想定していました.

どうしても,複数の画像を,HTML を使わず出力したい,ということであれば,GD や ImageMagick を使うことで,画像を合成する事はできますが,相当のスキルが必要とされる上に,あまりメリットは無いので,HTML を生成,画像を生成,という 2つのプログラムを書くほうがカンタンで,良いソリューションだと思います.

◎質問者からの返答

おっしゃっていることが、少しずつわかってきました。

> 画像データは,PHP から直接出力してしまえばいいのです.

この文章が1つ目の回答の敷居を下げた気がしました。


ただ、

img タグで php ファイルを指定するということは、imageoutput.php を起動させるためですよね?

また、key1の部分は、imageoutput.php 側では $_GET で受け取るのでしょうか?

この辺、勘違いしていますか?

よろしくお願いしますm(_ _)m


4 ● bayan
●22ポイント

> img タグで php ファイルを指定するということは、imageoutput.php を起動させるためですよね?

そういった理解でいいと思いますよ。


> また、key1の部分は、imageoutput.php 側では $_GET で受け取るのでしょうか?

はい、$_GET['image_id'] で受け取ってください。


なお、Smarty の foreach のところですが、key1 には $image_array の配列の添え字 0,1,... が入るので、image_id の値を使うには、次のようになるかなと思います。


{foreach from=$image_array key=key1 item=item1}
 <img src="./imageoutput.php?image_id={$item1.image_id}" />
{/foreach}
◎質問者からの返答

> 1つでないと難しいということでしょうか?

1つ目の回答への返信は思いっきり間違いでしたね。

{foreach}をかけることで目的の個数を表示させているわけですね。


imageoutput.phpのファイルを読みに行ってくれないんですが・・・。

原因はわかりませんが頑張ってみます。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ