【问题标题】:JSP page only loads one image from database [duplicate]JSP页面仅从数据库加载一张图片[重复]
【发布时间】:2016-02-18 19:25:18
【问题描述】:

我有一个 JSP 页面,我在其中循环加载数据库中的数据。数据库列之一包含存储为 Blob 的图像。当我不尝试加载图像列时,我能够成功加载数据库中的所有数据。

当我加载包括图片在内的所有数据时,页面上只显示一张图片,页面上不显示其他数据。为什么呢。从代码中可以看出,我有 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> 

【问题讨论】:

  • 这个response.setContentType("image/jpg"); 对我来说看起来很可疑。您将其设置为页面的响应对象,不是吗?我希望页面的 contentType 是例如text/html... 不过可能不是问题的根源。但是,您似乎确实将数据直接输出到响应并期望 jsp 的 html 内容也传递到那里......
  • @JanChimiak 尝试使用 text/html。甚至单个图像也不再出现,我得到一个空白屏幕。
  • 我不是这个意思。在 HTTP 级别,每个请求可以有一个内容类型。服务器发送字节序列+内容类型。浏览器使用它来将字节解析为文本或图像。在您的输出流中,您首先转储文本,然后转储图像,然后再次转储文本。见stackoverflow.com/questions/5243726/…或者base64编码图片什么的。
  • 我相信@JanChimiak 对内容类型的看法是正确的,而且您正在添加一个&lt;img ...&gt; 标记,其中src= 属性应该引用一个URL 从哪里加载图像,但是您将图像字节数据放在那里,这是行不通的。另外:使用 &lt;%%&gt; 并将 Java 代码直接放在 JSP 中已被认为是十多年来的不良做法。
  • @StephenP JSP 新手,不管你信不信,谷歌搜索为我提供了大量涉及 JSP 中的 Java 代码的指南。我快要结束了,不想重新开始所有编码以坚持良好的做法。未来的项目,当然。如您所见,我的问题涉及在多个图像的循环中将数据加载到图像 src 中。可以请帮助我,甚至可以解决这个问题的指南。失去了寻找答案的时间,却没有找到任何答案。

标签: java html jsp


【解决方案1】:

img 标签中的 src 不接受输出流,你需要在其他地方写输出流并在 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();
  }  
%>

【讨论】:

  • 有效。唯一的问题是我无法在循环的每次迭代中上传不同的图像。我最终得到了相同的图像(数据库行中的最后一个图像)。我尝试通过会话将 html 页面中的 id 值发送到 image.jsp,以便我可以从 TABLENAME WHERE id = 调用 SELECT image但结果相同。
【解决方案2】:

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

&lt;img class="k-profile-img" src="&lt;%o.write(pict);%&gt;"

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

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

您需要将浏览器可以读取的每种类型的内容传递到一个单独的 HTTP 响应中。 Html 例如text/html 和 JPEG 兼容的图像,例如image/jpg。这意味着您可以:

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

【讨论】:

    猜你喜欢
    • 2013-04-12
    • 2016-01-31
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多