【问题标题】:Displaying image in HTML and JSP code [duplicate]在 HTML 和 JSP 代码中显示图像 [重复]
【发布时间】:2010-11-16 23:37:02
【问题描述】:

如何在 HTML 和 JSP 代码中显示数据库中的图像?我用 JSP 编写了这段代码。

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page language="java" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>MindDotEditor posted Data</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="robots" content="noindex, nofollow" />
        <link href="../sample.css" rel="stylesheet" type="text/css" />
        <link rel="shortcut icon" href="../fckeditor.gif" type="image/x-icon" />
    </head>
    <body>

<%
    String url = "jdbc:mysql://localhost:3306/sample";
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    String id = (String) session.getAttribute("id");
    int j = Integer.parseInt(id);

    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        con = DriverManager.getConnection(url,"root","root");
        stmt = con.createStatement();
        rs = stmt.executeQuery("SELECT Image_File FROM Images WHERE Image_id = '3' ");
        int i = 1;
        if(rs.next()) {
            Blob len1 = rs.getBlob("Image_File");
            int len = (int)len1.length();
            byte[] b = new byte[len];
            InputStream readImg = rs.getBinaryStream(1);
            int index = readImg.read(b, 0, len);
            System.out.println("index" +index);
            stmt.close();
            response.reset();
            response.setContentType("image/jpg");
            response.getOutputStream().write(b,0,len);
            response.getOutputStream().flush();
        }
    } catch(Exception ex) {
        out.println(ex);
    } finally {
        rs.close();
        stmt.close();
        con.close();
    }
%>

        <br>
        <center><input type="button" value="Print" onclick="window.print();return false;" /></center>
    </body>
</html> 

【问题讨论】:

    标签: java jsp jdbc


    【解决方案1】:

    HTML 中的图像将使用&lt;img&gt; 元素表示。 &lt;img&gt; 元素有一个 src 属性,它应该指向一个返回图像的 URL。在这种特殊情况下,该 URL 可以只指向一个 Servlet,它从某个数据源(例如,使用 FileInputStream 从本地磁盘文件系统或使用 ResultSet#getBinaryStream() 从数据库)获取图像的 InputStream 并写入它以通常的Java IO 方式回复到OutputStream

    因此,您基本上需要更改 HTML 以包含以下内容:

    <img src="images?id=1">
    

    然后创建一个映射到/imagesurl-pattern 上的Servlet 并实现doGet() 大致如下:

    Image image = imageDAO.find(Long.valueOf(request.getParameter("id")));
    
    response.setContentType(image.getContentType());
    response.setContentLength(image.getContentLength());
    response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFileName() + "\"");
    
    BufferedInputStream input = null;
    BufferedOutputStream output = null;
    
    try {
        input = new BufferedInputStream(image.getInputStream());
        output = new BufferedOutputStream(response.getOutputStream());
        byte[] buffer = new byte[8192];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
    } finally {
        if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
        if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
    }
    

    应该是这样的。

    我当然假设您的数据库中的image 表已经具有(自我描述)列content_typecontent_lengthfile_name,否则您需要将第一个替换为"image" ,留下第二个(如果有问题的数据库支持它,或者替换为Blob#length())并为第三个硬编码一个(随机)名称。

    可以在this article 中找到此类ImageServlet 的另一个(略有不同并涵盖错误处理)示例。

    【讨论】:

      【解决方案2】:

      你必须使用另一种方法inline images

      data:[<mediatype>][;base64],<data>
      <img src="data:image/gif;base64,R0lGODlhEAAOALMAAO...." width="16" height="14" alt="embedded folder icon">
      

      确保对它进行 base64 编码。它不适用于 ie6 或 ie7,但适用于所有其他浏览器

      【讨论】:

        猜你喜欢
        • 2014-05-20
        • 2017-06-28
        • 2016-07-06
        • 1970-01-01
        • 2011-07-27
        • 2014-08-18
        • 2018-05-30
        • 1970-01-01
        • 2022-12-20
        相关资源
        最近更新 更多