10

従業員のチャートを表示するコードがあります。

データ(名前、電話番号、写真など)はSQLServerに保存され、JSPを介して表示されます。image .jpg(IMAGE = BLOB列に格納されている)を除いて、データの表示は問題ありません。

ちなみに、私はすでに画像を表示していますが(以下のコードを参照)、画像が通過したため、.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;
}

前もって感謝します !

4

4 に答える 4

18

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

最も簡単なのは、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年以来公式に強く推奨されていません。おそらく、あなたは完全に時代遅れの本/チュートリアルを読んでいたか、古いJSPWebアプリケーションを維持しています。いくつかの洞察については、いくつかのヒントについて次の質問の回答も参照してください。

于 2012-06-25T15:17:30.313 に答える
2

HTMLタグを介して画像を表示する場合は、クライアントブラウザが画像を読み込めるように、画像を読み込むサーバー内のリソースに画像を指定する必要があります。<img />そうすれば、タグのスタイルを設定できます。

これを実現するために、ほとんどの人ImageServletは、イメージのバイナリデータをロードしてを書き込みます<img src = "/source/to/someImageServlet?id=<%=rsSuper.getString("id")%>" id = "photo"/>

于 2012-06-25T15:17:31.527 に答える
2
  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);
        }

次に、jspページの属性を抽出するためにjstlを使用しました

 <img src="data:image/jpeg;base64,${imgBase}" />
于 2016-12-07T09:41:33.867 に答える
0
//globle variable
List listmap = new ArrayList();//with getter/setter

//method
Connection con = conn.getConnection();
PreparedStatement ps = null;
String query="select img from tablename";
ps = con.prepareStatement(query);
resultSet = ps.executeQuery();
while (resultSet.next()) {
PackagePojo p1=new PackagePojo();
// pojo class with field private String imagePath with getter/setter;
byte[] img = resultSet.getBytes("PTOIMAGE");//PTOIMAGE db column name
String encode=Base64.encodeBase64String(img );
p1.setImagePath(encode);
listmap.add(p1);
}

//in jsp with struts2

<s:iterator value="listmap">
<img src="data:image/jpeg;base64,${imagePath}" alt="bhudutt" title="bhudutt" />
</s:iterator>
于 2018-03-23T05:29:22.490 に答える