2009-08-05 40 views
1

Wie kann ich Bilder aus der Datenbank in HTML- und JSP-Code anzeigen? Ich habe diesen Code in JSP geschrieben.Bild in HTML- und JSP-Code anzeigen

<?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> 

Antwort

-1

Sie haben eine andere Methode verwenden inline images:

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

stellen Sie sicher, base64 es codieren. es funktioniert nicht mit ie6 oder ie7, sollte aber mit allen anderen Browsern funktionieren

2

Bilder in HTML sollen mit dem <img> Element dargestellt werden. Das Element hat ein src-Attribut, das auf eine URL verweisen sollte, die ein Bild zurückgibt. Diese URL kann in diesem speziellen Fall nur auf eine Servlet verweisen, die eine InputStream des Bildes von einer Datenquelle (zB vom lokalen Platten-Dateisystem mit FileInputStream, oder vom DB mit ResultSet#getBinaryStream()) erhält und in die OutputStream der üblichen Antwort schreibt Java IO Weg.

So müssen Sie im Grunde Ihre HTML ändern, gehören die folgenden: Erstellen

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

Dann eine Servlet, die auf einer url-pattern von /images abgebildet wird und implementieren die doGet() grob wie folgt:

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) {} 
} 

Das sollte es sein.

ich natürlich davon aus, dass die image Tabelle bereits in der Datenbank content_type, content_length und file_name die (selbsterklärend) Spalten hat, sonst werden Sie das erste mit "image" ersetzen müssen, lassen Sie die zweite weg (oder ersetzen Blob#length() wenn die fragliche Datenbank dies unterstützt) und Hardcode ein (zufälliger) Name für den dritten.

Eine andere (etwas andere und überdeckende Fehlerbehandlung) Beispiele eines solchen ImageServlet finden Sie in this article.