2009-08-05 7 views
1

Comment puis-je afficher une image de la base de données en code HTML et JSP? J'ai écrit ce code dans JSP.Affichage de l'image en code HTML et 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> 

Répondre

-1

vous devez utiliser une autre méthode inline images:

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

assurez-vous de base64 encoder. il ne fonctionnera pas avec IE6 ou IE7, mais devrait convenir à tous les autres navigateurs

2

Les images au format HTML doivent être représentées à l'aide de l'élément <img>. L'élément <img> a un attribut src qui doit pointer vers une URL qui renvoie une image. Cette URL peut dans ce cas pointer sur un Servlet qui obtient un InputStream de l'image de quelque source de données (par exemple du système de fichiers de disque local utilisant FileInputStream, ou de la base de données utilisant ResultSet#getBinaryStream()) et l'écrit sur le OutputStream de la réponse comme d'habitude Java IO manière.

Ainsi, vous avez besoin fondamentalement changer votre code HTML pour inclure les éléments suivants:

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

Ensuite, créez un Servlet qui est mis en correspondance sur un url-pattern de /images et mettre en œuvre le doGet() à peu près comme suit:

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

Ça devrait être ça.

Bien sûr, je suppose que la table image dans votre base de données a déjà les colonnes (auto-descriptif) content_type, content_length et file_name, sinon vous devrez remplacer le premier avec "image", laissez le deuxième écart (ou remplacer par Blob#length() si la base de données en question le supporte) et code un nom (aléatoire) pour le troisième.

Un autre exemple (un peu différent et traitant des erreurs de couverture) d'un tel ImageServlet peut être trouvé dans this article.