# Bild via JDBC und MySQL ausgeben



## Kooshy (21. Sep 2006)

Wie genau funktioniert denn das bitte einen Binären Stream in ein Web fähiges Bild umzuwandeln?

Das man dann via JSP darstellen kann?


welche Klassen und funktionen wären denn hier zu gebrauchen?

gruss


kooshy


----------



## huckfinn (29. Sep 2006)

Hi,
Na ja ich habs nur PSQL da aber das kann man ja ändern. Du schreibst ein Servlet, das auf die Datenbank zugreifen und einen Bilddatenstrom erzeugt und setzt ihn dann in die Serverpage ein. Jetz unüberprüft aber vom Code her etwa so. Ein Bild aus der Datenbank holen geht so .. ich gehe davon aus das in base64 als Text abgelegt ist aber unescapeSQL get auch. Das für dasServlet nehme ich an daß die Abfrage hat 3 Parameter table, imageColumn und imageIdent. Die Parameter muß du sinnvoll über die JSP setzen.


```
public class ImageServlet extends HttpServlet {

    private Connection  database   = null;
    private String databaseHost ="localhost";
    private String databasePort = "5432";
    private String databaseServerLogin ="nobody";
    private String databaseServerPassword ="nobody";
    private String databaseName = "database";
    private String jdbcClass    = "org.postgresql.Driver";
    private String jdbcPrefix   = "jdbc:postgresql";
   
  // DATENBANK ÖFFNEN
  public void openDb(String aJDBCDriver,
            String aJDBCPrefix,   String aHost,  String aPort,
            String aDatabase, String aUser,  String aPassword ) throws ServerShellException {
        try {
            Class.forName(aJDBCDriver);
            String aDbURL=aJDBCPrefix+"://"+aHost+":"+aPort+"/"+aDatabase;
            database = DriverManager.getConnection(aDbURL, aUser, aPassword);
        } catch( Exception e ) {
            throw new ServerShellException(
                    ServerShellException.ERROR_DATA_BACKPLANE_ACCESS+
                    " Details: "+e.getLocalizedMessage());
        }
    }
    
    // SERVLET INITIALISIEREN
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        databaseHost            = config.getInitParameter("DatabaseHost");
        databasePort            = config.getInitParameter("DatabasePort");
        databaseServerLogin     = config.getInitParameter("DatabaseServerLogin");
        databaseServerPassword  = config.getInitParameter("DatabaseServerPassword");
        databaseName            = config.getInitParameter("DatabaseName");
        jdbcClass               = config.getInitParameter("JdbcClass");
        jdbcPrefix              = config.getInitParameter("JdbcPrefix");
        openDb(jdbcDriver, jdbcPrefix, databaseHost,  databasePort, databaseName,
        databaseServerLogin, databaseServerPassword);
   }    

    // PARAMETER HOLEN
    public static TreeMap parseHttpRequestParameter(HttpServletRequest request) {
	String Token;	int Num =0;	TreeMap result = new TreeMap();
        Enumeration paramNames =  request.getParameterNames();
	while (paramNames.hasMoreElements()) {
         String prmName = (String)paramNames.nextElement();
         String[] prmValues = request.getParameterValues(prmName);
 	 if (prmValues!=null) {
	    Num = prmValues.length;
	    if (Num==1) 
	     result.put(new String(prmName), new String(prmValues[0])); 
	    else {
	     result.put(new String(prmName+".count"), Integer.toString(Num)); 
	     for (int i=0;i<Num;i++)	
 	      result.put(new String(prmName+"."+i), new String(prmValues[i])); 
            } 
	 } // end if
       } // end while
       return result; 
    }
    
    // BILD AUS DER DB HOLEN  UNESCAPE SQL geht auch ist nur einanderer Coder
    public void loadBase64Picture( int ident,   String identColumn,   String imageColumn,  String table,  DataOutputStream out) {
        try {
            String sql = "SELECT "+imageColumn+" FROM " + table +
                    " WHERE " + identColumn + " = " + ident + ";";
            res = stmt.executeQuery(sql);
            if (res.next() ) {
                String imageData = res.getString(imageColumn);
                title = res.getString(titleColumn);
                res.close();
                byte [] fromBase64 = Base64.decodeBase64(imageData.getBytes());
                out.write(fromBase64);
                //  image = new ImageIcon(fromBase64);
            }
        } catch (SQLException se) {
            System.out.println("Fehler beim Laden Bilddaten Ident " +
                    ident + " in " + table + "! Details: " + se);
        }
    }

    // HIER IST DER CODE
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        TreeMap param = TreeMap parameter  = StrUtils.parseHttpRequestParameter(request);
         String table = (String) param.get("table");
         String imageColumn = (String) param.get("imageColumn");
         String imageIdent = (String) param.get("imageIden");

        if (table==null) FEHLER und das auch für die 2 anderen Parameter

        response.setContentType("text/html;charset=UTF-8");
        DataOutputStream out = response.getWriter();
        loadBase64(table,imageColumn,imageIdent, out);
        out.close();
    }
    
     // Falls reques über POST 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

     // Falls reques über GET
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
 }
```

Ja und dann rufst du das Servlet in der JSP oder Html-Seite  auf:


```
<html><body>.....

  [img]http://host:8080/ImageServlet?table=tablename&imageColumn=imgaecolumn&imageIdent=imageident[/img]
....
</html>
```

Bis denne Huck


----------



## Guest (6. Okt 2006)

???:L  Danke


----------

