2016-02-18 30 views
2

我有一个JSP页面,用于从循环中的数据库加载数据。其中一个数据库列保存以Blob存储的图像。当我不尝试加载图像列时,我能够成功加载数据库中的所有数据。JSP页面仅从数据库加载一个图像

当我加载包括图像的所有数据中,只有一个图像显示在网页上,并没有其它数据被显示在页面上。为什么。从代码中可以看到,我有5列字符串和1列Blob。我应该得到这5行的每一个。我正在寻找一个解决方案,动态加载图像,而不是硬代码图像路径。

<body> 
<div class="container"> 
    <div class="row"> 
<% 
    String dbURL = "jdbc:mysql://1.1.1.1:3306/db_name"; 
    String dbUser = ""; 
    String dbPass = ""; 
    Connection conn; 
try{ 
     DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
     conn = DriverManager.getConnection(dbURL, dbUser, dbPass); 

     Statement statement = conn.createStatement(); 
     ResultSet resultset = 
       statement.executeQuery("select image, name, age, gender, contact, description from tablename"); 

     while(resultset.next()) { 
      Blob bl = resultset.getBlob(1); 
      byte[] pict = bl.getBytes(1,(int)bl.length()); 
      response.setContentType("image/jpg"); 
      OutputStream o = response.getOutputStream(); 
%> 

<div class="col-sm-4"> 
      <div class="k-cust_box"> 
       <h3><%= resultset.getString(2) %></h3> 
       <hr> 
       <img class="k-profile-img" src="<%o.write(pict);%>" height="100px" border="1" style="float: left; overflow: hidden" width="33%"> 
       <div class="k-driver-inner-box"> 
        <h5>Age: <%= resultset.getString(3) %></h5> 
        <h5>Gender: <%= resultset.getString(4) %></h5> 
        <h5>Contact: <%= resultset.getString(5) %></h5> 
       </div> 
       <h5 class="k-fl-lt"><%= resultset.getString(6) %></h5> 
      </div> 
     </div> 
<%} 

}catch (Exception e){ 
    e.printStackTrace(); 
} 

%> 
     </div> 
    </div> 
</body> 
+1

这'response.setContentType( “图像/ JPG”);'看起来腥给我。你将它设置为页面的响应对象,对吗?我期望页面的contentType是例如'text/html' ...虽然不是问题的根源。然而,你似乎直接输出数据到响应,并期望jsp的html内容也被传递到那里...... –

+0

@JanChimiak用text/html试过。即使单张图像不再出现,我也会看到空白的白色屏幕。 – JasSy

+1

这不是我的意思。在HTTP级别,每个请求可以有一个内容类型。服务器发送一系列字节+内容类型。浏览器使用它来将字节解析为文本或图像。在你的输出流中,你首先转储文本然后图像,然后再文本回来。请参阅http://stackoverflow.com/questions/5243726/how-to-display-an-image-in-jsp或base64编码图像或某事。 –

回答

1

src在img标签DONOT接受的OutputStream,你需要别人写的OutputStream那里,并提供IMG SRC例如链接:

<img class="k-profile-img" src="image.jsp" height="100px" border="1" style="float: left; overflow: hidden" width="33%"> 

image.jsp像

<% 
String dbURL = "jdbc:mysql://1.1.1.1:3306/db_name"; 
String dbUser = ""; 
String dbPass = ""; 
Connection conn; 
try{ 
    DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
    conn = DriverManager.getConnection(dbURL, dbUser, dbPass); 

    Statement statement = conn.createStatement(); 
    ResultSet resultset = 
      statement.executeQuery("select image from tablename"); 
    response.setContentType("image/jpg"); 
    while(resultset.next()) { 
     Blob bl = resultset.getBlob(1); 
     byte[] pict = bl.getBytes(1,(int)bl.length()); 
     } 
     OutputStream o = response.getOutputStream(); 
     o.write(pict); 
}catch (Exception e){ 
    e.printStackTrace(); 
    } 
%> 
+0

作品。唯一的问题是我无法在循环的每次迭代中上传不同的图像。我最终得到相同的图像(数据库行中的最后一张图片)。我试图通过会话将html页面的id值发送到image.jsp,以便我可以从TABLENAME WHERE id = =调用SELECT图像。但结果相同。 – JasSy

0

你不能只是将字节转储到jsp页面主体,并期望它在浏览器中呈现。你有

<img class="k-profile-img" src="<%o.write(pict);%>"

这将打印为大致<img class"k-profile-img" src="˙Ř˙ŕ JFIF ˙áÚExif II* (a lot of binary data follows">

这不是一个浏览器可以预期正确呈现。它可能会显示一些东西,但同样你也可能赢得宾果或被陨石击中。

您需要通过每种类型的内容浏览器都可以读取单独的 HTTP响应。 Html例如text/html和JPEG兼容图像例如image/jpg。这意味着您可以:

  • 提供来自不同页面的图像(这就是HTML属性指向的内容--Href指向不同位置)。
  • 将内嵌图像作为HTML内容的另一个节点提供。这通常是在src之内使用base64编码的内容完成的,但请注意,并非所有旧版本的浏览器都支持此(IE)。见How to build base64 image src with jsp source?
相关问题