2017-04-04 17 views
0

我已經編寫了一個java servlet來插入和顯示數據庫中的用戶信息。我正在爲所有用戶插入一張照片。問題是,當我想要顯示的字節數組的照片則顯示只是第一個字節例如:[B @ 43809cd3Java Servlet將用戶信息存儲到Java DB中

private void doAddUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    InputStream inputStream = null; 
    Part filePart = request.getPart("image"); 
     if (filePart != null) { 
      // prints out some information for debugging 
      System.out.println(filePart.getName()); 
      System.out.println(filePart.getSize()); 
      System.out.println(filePart.getContentType()); 
      // obtains input stream of the upload file 
      inputStream = filePart.getInputStream(); 
     } 

    String message = null;    
    try { 
     // Register JDBC driver 
     Class.forName("org.apache.derby.jdbc.ClientDriver"); 
     // Open a connection 
     Connection conn = DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/tutoriumDB", "db", "db");   
     // Execute SQL query 
     PreparedStatement st= conn.prepareStatement("insert into users(ID,NAME,LAT,LONG,IMAGE) values(?,?,?,?,?)");         
     st.setString(1, request.getParameter("id1")); 
     st.setString(2, request.getParameter("name")); 
     st.setString(3, request.getParameter("lat")); 
     st.setString(4, request.getParameter("long")); 
     if (inputStream != null) {    
       //st.setBlob(5, inputStream); 
       st.setBinaryStream(5, inputStream, (int)filePart.getSize()); 
     } 
     int row = st.executeUpdate(); 
     if (row > 0) { 
      message = "File uploaded and saved into database"; 
     } 

     st.close(); 
     conn.close(); 

     try (PrintWriter out = response.getWriter()) { 
       out.println("Der Benutzer mit der ID: " +request.getParameter("id1")+" und Name: " + 
        request.getParameter("name")+" wurde eingefuegt"); 
     } 
    } catch (ClassNotFoundException | SQLException ex) { 
     Logger.getLogger(TutServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    // sets the message in request scope 
    request.setAttribute("Message", message); 
    // forwards to the message page 
    getServletContext().getRequestDispatcher("/submit.jsp").forward(
      request, response); 
} 

private void getAllUsers(HttpServletRequest request, HttpServletResponse response) throws IOException 
{ 

    try { 
     // Register JDBC driver 
     Class.forName("org.apache.derby.jdbc.ClientDriver"); 

     // Open a connection 
     Connection conn = DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/tutoriumDB", "db", "db"); 

     // Execute SQL query 
     String sql = "SELECT * FROM users order by ID"; 
     Statement stmt = conn.createStatement(); 

     ResultSet rs = stmt.executeQuery(sql); 
     byte[] imgData = null ; 
     ArrayList<String> users = new ArrayList<String>(); 
     while (rs.next()) { 
      int id = rs.getInt("id"); 
      String name = rs.getString("name"); 
      double lat = rs.getDouble("lat"); 
      double longit = rs.getDouble("long"); 
      byte[] bytes = rs.getBytes("image");    
      users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +bytes); 
     } 

     stmt.close(); 
     conn.close(); 

     try (PrintWriter out = response.getWriter()) { 
      for (String s : users) 
      { 
       out.println(s); 
      } 
     } 
    } catch (ClassNotFoundException | SQLException ex) { 
     Logger.getLogger(TutServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } 


} 

Result of getAllUser

+0

這些不是「第一字節」,這是字節數組的標準'toString'表示。 –

+0

好的。有沒有一種方法來顯示整個數組? –

回答

0

好讓我查一下我analize你的代碼,看到的圖像,圖像是正確的,因爲你正在使用

users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +bytes); 

,你可以看到被稱爲字節的變種是這樣的:

byte[] bytes = rs.getBytes("image");  

爲什麼它變得[B @ 43809cd3?因爲toString的方法在字節中沒有重載。

你能做什麼?如果你的字節不爲空,然後遍歷它,讓你自己是這樣的:

byte[] bytes = new byte[2]; 
bytes[0] = 1; 
bytes[1] = 127; 

System.out.println(bytes); 
StringBuilder byteAppender = new StringBuilder(""); 
if(null != bytes){ 
    for(byte b: bytes){ 
     byteAppender.append(b); 
    } 
    System.out.println("Ok bites are " +byteAppender); 
} 

所以,現在你會把byteAppender而不是字節,因此這將是:

users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +byteAppender); 

所以,你的折軸也能像這樣的:

private void getAllUsers(HttpServletRequest request, HttpServletResponse response) throws IOException 
    { 

     try { 
      // Register JDBC driver 
      Class.forName("org.apache.derby.jdbc.ClientDriver"); 

      // Open a connection 
      Connection conn = DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/tutoriumDB", "db", "db"); 

      // Execute SQL query 
      String sql = "SELECT * FROM users order by ID"; 
      Statement stmt = conn.createStatement(); 

      ResultSet rs = stmt.executeQuery(sql); 
      byte[] imgData = null ; 
      ArrayList<String> users = new ArrayList<String>(); 
      StringBuilder byteAppender = new StringBuilder(""); //here is the String you will make 
      while (rs.next()) { 
       int id = rs.getInt("id"); 
       String name = rs.getString("name"); 
       double lat = rs.getDouble("lat"); 
       double longit = rs.getDouble("long"); 
       byte[] bytes = rs.getBytes("image");  
       if(null != bytes){ //you ask the object is not null 
        for(byte b: bytes){ //you itarete it 
         byteAppender.append(b); //you add it 
        } 
       } 
       users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +byteAppender); //you put it 
       byteAppender.setLength(0); //you restart it 
      } 

      stmt.close(); 
      conn.close(); 

      try (PrintWriter out = response.getWriter()) { 
       for (String s : users) 
       { 
        out.println(s); 
       } 
      } 
     } catch (ClassNotFoundException | SQLException ex) { 
      Logger.getLogger(TutServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 


    } 

你也可以這樣說的:how to convert byte array to string and vice versa

希望它他幫你。

Cya

+0

感謝您的回答,但現在它顯示如下:-119807871131026100001373726882000-128000-12886000-616297-530066-5573686584120 .....它不是初始字節數組 –

+0

嗯,你可以做你自己的迭代,或使它工作,我只是做了一個例子;)我不知道如何看起來真正的一個以及字節[]如何保存它...對不起=) – Yussef