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) )

回答の条件
  • 1人2回まで
  • 登録:2008/11/21 01:33:38
  • 終了:2008/11/22 16:10:13

回答(4件)

id:goodvn No.1

goodvn回答回数228ベストアンサー獲得回数182008/11/21 02:34:58

ポイント23pt

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

  • HTML
  • 画像データ

の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 は使いません.使ってもできますが,ほぼ無意味でしょう.

id:seadwell

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

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


チョット質問です。

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

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

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

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

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

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

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


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

2008/11/21 15:56:20
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/11/21 07:09:17

ポイント23pt

画像を表示するには 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に格納せず、ファイルとしてサーバの適当なディレクトリに保存するのがよいでしょう。

id:seadwell

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

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

2008/11/21 15:37:33
id:goodvn No.3

goodvn回答回数228ベストアンサー獲得回数182008/11/21 18:54:28

ポイント22pt

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

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

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

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

id:seadwell

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

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

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


ただ、

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

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

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

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

2008/11/21 20:28:33
id:bayan No.4

bayan回答回数100ベストアンサー獲得回数132008/11/22 11:17:16

ポイント22pt

> 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}
id:seadwell

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

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

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


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

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

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

2008/11/22 15:50:30
  • id:pahoo
    回答にはなっていないのでコメント欄に書きますが、DBに画像データを入れて、単に取り出すだけという処理はCPUコストの無駄遣いです。
    画像はデータサイズが大きいのでDBMSに負荷がかかりますし、それを画像として再構築するためにPHP処理系とhttpdサーバにも負荷がかかります。

    DBMSに格納しなければならない積極的な理由がなければ、下記のように画像ファイル名をDBに持たせるのが一般的です。
    $image_array[0]['image_fname'] = 'hoge0.jpg';
    $image_array[1]['image_fname'] = 'hoge1.jpg';
    ...

    こうすれば、HTMLテンプレートに
    <img src="{$image_array[0]['image_fname']} />
    <img src="{$image_array[1]['image_fname']} />
    ...
    と書くことで、同時に複数の画像を表示することができます。
  • id:seadwell
    コメントでの回答ありがとうございます。
    画像を取り扱うこと自体が初めての経験なので、このようなアドバイスは非常にありがたいです。

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

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

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

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