2012-06-25 15 views
10

グラフの従業員を表示するコードがあります。JSPを使用してBLOB(画像)を表示

データ(名前、電話、写真など)はSQLServerに保存され、JSPで表示されます。 画像は.jpg(IMAGE = BLOB列に保存されています)を除いてOKです。

ところで、すでに画像が表示されていますが(下のコードを参照)、.cssで定義された領域に配置する方法はわかりません(下記のコードも参照してください)。 resultSetを介して取得されたイメージは、ブラウザのページ全体にロードされます。

画像をどのようにフレーム化できますか?

<% 
Connection con = FactoryConnection_SQL_SERVER.getConnection("empCHART"); 
Statement stSuper = con.createStatement(); 
Statement stSetor = con.createStatement(); 

Blob image = null; 
byte[] imgData = null; 

ResultSet rsSuper = stSuper.executeQuery("SELECT * FROM funChart WHERE dept = 'myDept'"); 

if (rsSuper.next()) { 
image = rsSuper.getBlob(12); 
imgData = image.getBytes(1, (int) image.length()); 
response.setContentType("image/gif"); 
OutputStream o = response.getOutputStream(); 
//o.write(imgData); // even here we got the same as below. 
//o.flush(); 
//o.close(); 

--[...] 

<table style="margin: 0px; margin-top: 15px;"> 
<tr> 
<td id="photo"> 
<img title="<%=rsSuper.getString("empName").trim()%>" src="<%= o.wite(imageData); o.flush(); o.close(); %>" /> 
</td> 
</td> 

<td id="empData"> 
<h3><%=rsSuper.getString("empName")%></h3> 
<p><%=rsSuper.getString("Position")%></p> 
<p>Id:<br/><%=rsSuper.getString("id")%></p> 
<p>Phone:<br/><%=rsSuper.getString("Phone")%></p> 
<p>E-Mail:<br/><%=rsSuper.getString("Email")%></p> 
</td> 
</table> 

そして、ここに画像をフレームになっフラグメントである:事前に

#photo 
{ 
    padding: 0px; 
    vertical-align: middle; 
    text-align: center; 
    width: 170px; 
    height: 220px; 
} 

ありがとう!

+0

JSPページの属性。そのため、JSPページには ''のようなものしか含まれておらず、イメージのバイナリに応答するサーブレットがあります。別の解決策(私はそれをお勧めしません)は、JSPページでbase64としてイメージを送信することです。 –

答えて

16

あなたはここでいくつかの基本的な間違いを犯しています。 <img src>は、画像のバイナリコンテンツを含まないURLを指している必要があります。 JSPページ自体のコンテンツタイプはimage/gifに設定しないでください。デフォルト値はtext/htmlにしてください。あなたが期待していたように、WebサーバーがHTMLの結果に具体的なイメージを含めることになっているのは当てはまりません。それは、src属性にあるURLに基​​づいて個別に画像をダウンロードし、それに応じてそれを提示するウェブブラウザです。

最も簡単なのは、DBからレスポンス本体にイメージをストリームする別のサーブレットを作成することです。要求パラメータまたはパス情報によってイメージを一意に識別できます。ここではそのためのリクエストパラメータを使用する例です:

<img src="imageServlet?id=<%=rsSuper.getString("id")%>" /> 

doGet()方法は、その後基本的にこのジョブを実行する必要があります。を使用して、具体的な問題に無関係

String id = request.getParameter("id"); 

// ... 

InputStream input = resultSet.getBinaryStream("imageColumnName"); 
OutputStream output = response.getOutputStream(); 
response.setContentType("image/gif"); 
// Now write input to output the usual way. 

を、スクリプトレットこの方法は、10年以来正式に強く推奨されていません。おそらくあなたは完全に時代遅れの本/チュートリアルを読んでいたのでしょうか、古代のJSP Webアプリケーションを維持していたでしょうか。あなたがHTMLタグを介して画像を表示したい場合は、あなたを

+0

また、OPは 'service()'メソッドをオーバーライドすることができ、HTTPメソッドについて心配する必要はありません。 :p –

+1

@Elite:クライアントが意味的に間違った方法を使ってイメージを冪等で検索するのは、サーブレットの失敗ではありません。それはいつも得意です。それ以外のものは間違っています。 – BalusC

+0

を使用するか、 'data:' url http://en.wikipedia.org/wiki/Data_URI_scheme –

2

:いくつかの洞察力のために、また、いくつかのヒントについては、以下の質問の答えをご覧くださいイメージをロードするサーバー内のリソースにイメージをポイントする必要があります。これにより、クライアント・ブラウザーはイメージをロードできます。そうすれば、<img />タグをスタイルすることができます。

これを達成するために、ほとんどの人は画像のバイナリデータをロードして<img src = "/source/to/someImageServlet?id=<%=rsSuper.getString("id")%>" id = "photo"/>と書いてImageServletと書いています。

+0

あなたの注意をお寄せいただきありがとうございます! – jMarcel

0
Connection con = new DBConnection().getConnection(); 
     String sql = " SELECT * FROM tea "; 
     PreparedStatement ps = con.prepareStatement(sql); 
     ResultSet rs = ps.executeQuery(); 

     while (rs.next()) { 
      byte[] imgData = rs.getBytes("img"); // blob field 
      request.setAttribute("rvi", "Ravinath"); 
      rs.getString("teatitle"); 

      String encode = Base64.getEncoder().encodeToString(imgData); 
      request.setAttribute("imgBase", encode); 
     } 

その後、抽出のために使用さJSTLは、標準液は通常、ブラウザの要求に応答する別のサーブレットによって提供される画像からHTMLを(ここでは)、分離することである

<img src="data:image/jpeg;base64,${imgBase}" /> 
+0

このアプローチは非常に非効率的であることに注意してください。多くの場合、画像アップロードのプレビュー機能としてこれを使用します。適切に設計されたWebアプリケーションでは、これらの一時的なイメージは、最初にDBにまだ格納されていません。言い換えれば、この方法は静的画像の表示には絶対に推奨されません。 – BalusC

関連する問題