Avatar billede mads375 Juniormester
10. februar 2014 - 14:11 Der er 27 kommentarer og
1 løsning

returnere image fra MySQL

Hejsa

Jeg har fra hjælp fra Arne fået lavet en servlet som tjekker om en bruger findes i min MySQL database.  Igår byggede jeg så videre på det, så brugeren bliver redirectet til en side, hvor man kan uploade et billede til databasen. Det virker også helt fint, men nu vil jeg gerne have at når billedet er uploadet, kan man også returnere sit image og få det vist. Jeg har prøvet at lave min servlet og en JSP side som henter den pågældende servlet. Men det virker ikke. Er jeg på rette vej, eller?

Servlet:

package jsp;

import java.sql.*;
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;


    public class ImageServlet extends  HttpServlet{
   
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse
      response) throws ServletException, IOException{
      //PrintWriter pw = response.getWriter();
     
       
        String connectionURL = "jdbc:mysql://localhost/dblogin";
        Connection connection = null;
        response.setContentType("text/html");
     
      try{ 
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          connection = DriverManager.getConnection(connectionURL,"root",""); 
          Statement st1 = connection.createStatement();
          ResultSet rs1 = st1.executeQuery("SELECT image FROM photo WHERE firstname='mads'");
          String imgLen="";
              if(rs1.next()){
              imgLen = rs1.getString(1);
              System.out.println(imgLen.length());
              } 
             
              rs1 = st1.executeQuery
              ("SELECT image FROM photo WHERE firstname='mads'");
             
              if(rs1.next()){
              int len = imgLen.length();
              byte [] rb = new byte[len];
              InputStream readImg = rs1.getBinaryStream(1);
              int index=readImg.read(rb, 0, len); 
         
                  System.out.println("index"+index);
                st1.close();
                response.reset();
                response.setContentType("image/jpg");
                response.getOutputStream().write(rb,0,len);
                response.getOutputStream().flush(); 
              }
          }
          catch (Exception e){
          e.printStackTrace();
          }
      }
    }

JSP:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Get Image</title>
</head>
<body>
    <p>Here you can see the image</p>
   
    <a href="ImageServlet">Click For Photo</a>

</body>
</html>

Mvh Mads
Avatar billede arne_v Ekspert
10. februar 2014 - 15:17 #1
du mangler en annotation paa servlet medmindre du er skiftet til web.xml
Avatar billede arne_v Ekspert
10. februar 2014 - 15:19 #2
Jeg ville droppe:

int len = imgLen.length();
byte [] rb = new byte[len];

og i.s.f. have en while loekke som laeser og skrive direkte ud.

En af grundene til dette er at du selvom du kender laengden alligevel skal have en while loekke.
Avatar billede arne_v Ekspert
10. februar 2014 - 15:21 #3
Snippet:

        InputStream is = <hvor dine data kommer fra>;
        byte[] b = new byte[10240];
        int n;
        while((n = is.read(b)) >= 0) {
          response.getOutputStream().write(b, 0, n);
        }
        is.close();
Avatar billede arne_v Ekspert
10. februar 2014 - 15:22 #4
Og saa skal du nok paa et tidspunkt have erstattet:

<a href="ImageServlet">Click For Photo</a>

med:

<img src="ImageServlet">
Avatar billede mads375 Juniormester
10. februar 2014 - 16:51 #5
Ok fedt Arne. Jeg læser lige noget mere omkring inputStream/outputStream så vender jeg tilbage :-)
Avatar billede mads375 Juniormester
11. februar 2014 - 11:45 #6
Hej igen Arne.
Er jeg helt forkert på den nu?

package jsp;

import java.sql.*;
import java.io.InputStream;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.FileInputStream;
import java.io.OutputStream;

@WebServlet(urlPatterns = {"/ImageServlet"})

public class ImageServlet extends  HttpServlet{
   
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse
      response) throws ServletException, IOException{
      //PrintWriter pw = response.getWriter();
     
       
        String connectionURL = "jdbc:mysql://localhost/dblogin";
        Connection connection = null;
        response.setContentType("text/html");
     
      try{ 
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          connection = DriverManager.getConnection(connectionURL,"root",""); 
          Statement st1 = connection.createStatement();
          ResultSet rs1 = st1.executeQuery("SELECT image FROM photo WHERE firstname='mads'");
          String imgLen="";
              if(rs1.next()){
              imgLen = rs1.getString(1);
              System.out.println(imgLen.length());
              } 
             
              rs1 = st1.executeQuery
              ("SELECT image FROM photo WHERE firstname='mads'");
             
              if(rs1.next()){
                  InputStream is = new FileInputStream(connection);
                  byte[] b = new byte[10240];
                  int n;
                      while((n = is.read(b)) >= 0) {
                          response.getOutputStream().write(b, 0, n);
                }
                      is.close();
         
                  System.out.println("index"+ imgLen);
                st1.close();
                response.reset();
                response.setContentType("image/jpg");
               
              }
          }
          catch (Exception e){
          e.printStackTrace();
          }
      }
    }
Avatar billede arne_v Ekspert
11. februar 2014 - 17:03 #7
String imgLen="";
              if(rs1.next()){
              imgLen = rs1.getString(1);
              System.out.println(imgLen.length());
              } 

maa kunne slettes
Avatar billede arne_v Ekspert
11. februar 2014 - 17:04 #8
InputStream is = new FileInputStream(connection);

skal vel vaere:

InputStream is = rs1.getBinaryStream();
Avatar billede arne_v Ekspert
11. februar 2014 - 17:06 #9
response.reset();

skal slettes.

response.setContentType("image/jpg");

skal flyttes op i toppen.
Avatar billede mads375 Juniormester
15. februar 2014 - 12:12 #10
Hej igen Arne.

Jeg har fået rettet lidt kode til, så hvordan ser det ud nu?

package jsp;

import java.sql.*;
import java.io.InputStream;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;


@WebServlet(urlPatterns = {"/ImageServlet"})

public class ImageServlet extends  HttpServlet{
   
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse
      response) throws ServletException, IOException{
      //PrintWriter pw = response.getWriter();
     
        response.setContentType("image/jpg");
        String connectionURL = "jdbc:mysql://localhost/dblogin";
        Connection connection = null;
        response.setContentType("text/html");
     
      try{ 
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          connection = DriverManager.getConnection(connectionURL,"root",""); 
          Statement st1 = connection.createStatement();
          ResultSet rs1 = st1.executeQuery("SELECT image FROM photo WHERE firstname='mads'");
          String imgLen="";
              if(rs1.next()){
              imgLen = rs1.getString(1);
              System.out.println(imgLen.length());
              } 
             
              rs1 = st1.executeQuery
              ("SELECT image FROM photo WHERE firstname='mads'");
             
              if(rs1.next()){
                  InputStream is = rs1.getBinaryStream("photo");
                  byte[] b = new byte[10240];
                  int n;
                      while((n = is.read(b)) >= 0) {
                          response.getOutputStream().write(b, 0, n);
                }
                      is.close();
         
                  System.out.println("index"+ imgLen);
                st1.close();
               
                  }
          }
          catch (Exception e){
          e.printStackTrace();
          }
      }
    }
Avatar billede arne_v Ekspert
15. februar 2014 - 14:57 #11
Virker det?
Avatar billede arne_v Ekspert
15. februar 2014 - 14:58 #12
ResultSet rs1 = st1.executeQuery("SELECT image FROM photo WHERE firstname='mads'");
          String imgLen="";
              if(rs1.next()){
              imgLen = rs1.getString(1);
              System.out.println(imgLen.length());
              } 

maa kunne slettes
Avatar billede mads375 Juniormester
15. februar 2014 - 15:07 #13
Hej igen Arne.
Nej det virker ikke, der kommer min tekst ud: "Her kan du se dit image, og så en lille blå kasse med et spørgsmålstegn".

Jeg prøvede at slette koden, så den ser sådan ud:

package jsp;

import java.sql.*;
import java.io.InputStream;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;


@WebServlet(urlPatterns = {"/ImageServlet"})

public class ImageServlet extends  HttpServlet{
   
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse
      response) throws ServletException, IOException{
      //PrintWriter pw = response.getWriter();
     
        response.setContentType("image/jpg");
        String connectionURL = "jdbc:mysql://localhost/dblogin";
        Connection connection = null;
        response.setContentType("text/html");
     
      try{ 
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          connection = DriverManager.getConnection(connectionURL,"root",""); 
          Statement st1 = connection.createStatement();
         
             
              rs1 = st1.executeQuery
              ("SELECT image FROM photo WHERE firstname='mads'");
             
              if(rs1.next()){
                  InputStream is = rs1.getBinaryStream("photo");
                  byte[] b = new byte[10240];
                  int n;
                      while((n = is.read(b)) >= 0) {
                          response.getOutputStream().write(b, 0, n);
                }
                      is.close();
         
                  System.out.println("index"+ rs1);
                st1.close();
               
                  }
          }
          catch (Exception e){
          e.printStackTrace();
          }
      }
    }

Her manger rs1 jo så en lokalvariabel og imglen kan selvfølgelig ikke be resolved to a variable. Derfor prøvede jeg at lave det, så det så sådan ud:

package jsp;

import java.sql.*;
import java.io.*;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;


@WebServlet(urlPatterns = {"/ImageServlet"})

public class ImageServlet extends  HttpServlet{
   
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse
      response) throws ServletException, IOException{
      //PrintWriter pw = response.getWriter();
     
        response.setContentType("image/jpg");
        String connectionURL = "jdbc:mysql://localhost/dblogin";
        Connection connection = null;
        response.setContentType("text/html");
     
      try{ 
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          connection = DriverManager.getConnection(connectionURL,"root",""); 
          Statement st1 = connection.createStatement();
         
             
              ResultSet rs1 = st1.executeQuery
              ("SELECT image FROM photo WHERE firstname='mads'");
             
              if(rs1.next()){
                  InputStream is = rs1.getBinaryStream("photo");
                  byte[] b = new byte[10240];
                  int n;
                      while((n = is.read(b)) >= 0) {
                          response.getOutputStream().write(b, 0, n);
                }
                      is.close();
         
                  System.out.println("index"+ rs1);
                st1.close();
               
                  }
          }
          catch (Exception e){
          e.printStackTrace();
          }
      }
    }

Men stadigvæk med blank side
Avatar billede mads375 Juniormester
15. februar 2014 - 15:11 #14
min database ser sådan ud:

http://postimg.org/image/jklm9ptvf/
Avatar billede arne_v Ekspert
15. februar 2014 - 15:13 #15
proev at debugge noget inden i while loekke og se hvor mange bytes du laeser
Avatar billede arne_v Ekspert
15. februar 2014 - 15:15 #16
ups

slet

response.setContentType("text/html");
Avatar billede mads375 Juniormester
15. februar 2014 - 15:25 #17
jeg ved godt hvad debugge betyder, men hvordan bruger jeg det lige i dette sammenhæng :-/
Avatar billede mads375 Juniormester
15. februar 2014 - 15:26 #18
Men det er rigtig nok som jeg har gjort med:

ResultSet rs1 = st1.executeQuery

Altså lave en varabel til rs1 og udskriver det nede i :

System.out.println("index"+ rs1);

ikke?
Avatar billede arne_v Ekspert
15. februar 2014 - 15:33 #19
System.out.println("index"+ rs1);

viser naeppe noget interessant

men

System.out.println(n);

inden i while loekken kunne
Avatar billede arne_v Ekspert
15. februar 2014 - 15:33 #20
Har du faar slettet

response.setContentType("text/html");

?
Avatar billede mads375 Juniormester
15. februar 2014 - 15:41 #21
Jep det gjorde jeg. Koden ser nu sådan ud:

package jsp;

import java.sql.*;
import java.io.*;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;


@WebServlet(urlPatterns = {"/ImageServlet"})

public class ImageServlet extends  HttpServlet{
   
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse
      response) throws ServletException, IOException{
      //PrintWriter pw = response.getWriter();
     
       
        String connectionURL = "jdbc:mysql://localhost/dblogin";
        Connection connection = null;
        response.setContentType("image/jpg");
     
      try{ 
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          connection = DriverManager.getConnection(connectionURL,"root",""); 
          Statement st1 = connection.createStatement();
         
             
              ResultSet rs1 = st1.executeQuery
              ("SELECT image FROM photo WHERE firstname='mads'");
             
              if(rs1.next()){
                  InputStream is = rs1.getBinaryStream("photo");
                  byte[] b = new byte[10240];
                  int n;
                      while((n = is.read(b)) >= 0) {
                          response.getOutputStream().write(b, 0, n);
                          System.out.println(n);
                }
                      is.close();
         
                 
                st1.close();
               
                  }
          }
          catch (Exception e){
          e.printStackTrace();
          }
      }
    }


Jeg bliver nød til lige at vende tilbage imorgen, jeg bliver nød til at løbe ud af døren nu. Mange tak for hjælpen Arne

Mvh Mads
Avatar billede mads375 Juniormester
17. februar 2014 - 11:06 #22
Jeg prøvede lige at teste om billedet overhovedet lå på databasen, og det gør den. Altså når jeg gemmer binary data på min disk som en jpg fil, så får jeg det korrekte billeder frem. Jeg prøvede at ændre det til

("SELECT image FROM photo WHERE lastname='test'");

da jeg har flere firstname som er Mads
Avatar billede mads375 Juniormester
17. februar 2014 - 11:09 #23
Jeg får stadigvæk et blåt spørgsmål der hvor billedet skulle vises
Avatar billede mads375 Juniormester
17. februar 2014 - 11:39 #24
Hej Arne.

Det var min MySQL sti den var gal med.

Her er den korrekte kode:

package jsp;

import java.sql.*;
import java.io.*;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;


@WebServlet(urlPatterns = {"/ImageServlet"})

public class ImageServlet extends  HttpServlet{
   
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse
      response) throws ServletException, IOException{
      //PrintWriter pw = response.getWriter();
     
       
        String connectionURL = "jdbc:mysql://localhost/dblogin";
        Connection connection = null;
        response.setContentType("image/jpg");
     
      try{ 
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          connection = DriverManager.getConnection(connectionURL,"root",""); 
          Statement st1 = connection.createStatement();
         
             
              ResultSet rs1 = st1.executeQuery
              ("SELECT photo FROM login WHERE lastname='test'");
             
              if(rs1.next()){
                  InputStream is = rs1.getBinaryStream("photo");
                  byte[] b = new byte[10240];
                  int n;
                      while((n = is.read(b)) >= 0) {
                          response.getOutputStream().write(b, 0, n);
                          System.out.println(n);
                }
                      is.close();
         
                  st1.close();
               
                  }
          }
          catch (Exception e){
          e.printStackTrace();
          }
      }
    }


Jeg havde oprindelig:
("SELECT image FROM photo WHERE lastname='test'");
men det er:
("SELECT photo FROM login WHERE lastname='test'");

Altså mit column name er photo og mit table name er login.

Mange tak for hjælpen og husk at smid et svar :-)

Mvh Mads
Avatar billede arne_v Ekspert
17. februar 2014 - 14:13 #25
svar
Avatar billede arne_v Ekspert
17. februar 2014 - 14:13 #26
Med forkert SQL har du vel faaet en SQLException?
Avatar billede mads375 Juniormester
17. februar 2014 - 14:19 #27
Jeg kan godt se hvad du mener. Jeg prøvede lige at lave det om igen og køre min servlet. Når jeg køre med det forkerte:

"SELECT image FROM photo WHERE lastname='test'");

Får jeg en hvid skærm, men en boks "gem som" boks, hvor jeg kan gemme billedet. Men kan godt se jeg burde få en exception
Avatar billede arne_v Ekspert
17. februar 2014 - 14:24 #28
e.printStackTrace();

boer vises i server consollen - ikke paa siden
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester