2011-04-22 3 views
0

jsp가 있는데, 테이블의 각 행에 대해 데이터베이스에있는 이미지를 표시해야합니다. 나는 Blob과 같은 이미지를 포함하여 데이터베이스로부터 모든 테이블 행 데이터를 검색하여 그것을 bean에 저장한다. 이미지가 이렇게 바이트 배열로 빈에 저장된다Servlet의 jsp 내부 이미지가 제공되지 않습니다.

photo = rs.getBlob("PHOTO"); 
photoByteArray = photo.getBytes(1, (int)photo.length()); 

은 JSP 콩의리스트를 반복하지만, 이런 서블릿 src 속성 포인트 :

<img class="img" width="55" height="50" src="displayThumbnail?photoData=${part.photoData}"> 

가 게재되는 아래 그림과 같은 이미지이지만 바이트 배열을 디버깅 할 때 데이터가 표시되는 것처럼 보이지 않습니다.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { 
    response.setContentType("image/jpeg"); 
    OutputStream o = response.getOutputStream(); 
    String photoDataStr = request.getParameter("photoData"); 
    byte[] photoData = null; 
    if(photoDataStr != null) { 
     photoData = photoDataStr.getBytes(); 
    } 
    o.write(photoData); 
    o.close(); 
} 

그러나 이미지가 표시되지 않습니다. 이제 아래 그림과 같이 각 개별 이미지의 데이터베이스를 쿼리하면 이미지가 제대로 표시됩니다.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) { 
    PreparedStatement pstmt = null; 
    ResultSet rs = null; 
    Connection conn = null; 
      try { 
     if(conn == null) { 
      conn = open(); 
     } 
     pstmt = conn.prepareStatement("select photo from PART_PHOTOS where id = ?"); 
     String id = request.getParameter("id"); 
     pstmt.setString(1, id); 
     rs = pstmt.executeQuery(); 
     if (rs.next()) { 
      Blob b = rs.getBlob("photo"); 
      response.setContentType("image/jpeg"); 
      response.setContentLength((int) b.length()); 
      InputStream is = b.getBinaryStream(); 
      OutputStream os = response.getOutputStream(); 
      byte buf[] = new byte[(int) b.length()]; 
      is.read(buf); 
      os.write(buf); 
      os.close(); 
      is.close(); 
     } 
    } catch (Exception ex) { 
     System.out.println(ex.getMessage()); 
     ex.printStackTrace(); 
    } finally { 
     if (rs != null) { 
      try { 
       rs.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
      rs = null; 
     } 
     if (pstmt != null) { 
      try { 
       pstmt.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
      pstmt = null; 
     } 
     //check if it's the end of the loop 
      if (conn != null) { 
        try { 
         conn.close(); 
        } catch (SQLException e) { 
         e.printStackTrace(); 
        } 
        conn = null; 
       } 
    } 
} 

누구든지 동일한 권장 사항을 제공 할 수 있다면 매우 감사하겠습니다.

답변

0

임의의 바이너리 데이터를 HTML 파일에 넣을 수 있다고 가정하면 올바르게 파싱되어 서버로 그대로 전송됩니다. 이것은 나쁜 가정입니다! 그 밖의 것이 없다면, 따옴표 문자의 ASCII에 해당하는 바이트가 문제를 일으킬 것입니다. 맞습니까? 인코딩 문제는 물론 URL에 대한 매개 변수가 URL 인코딩되어야한다는 사실은 말할 필요도 없습니다. 이것은 실패 할 운명입니다.

이 작업을 수행하려면 페이지 (base64, 아마)를 제공 할 때 이진 데이터의 명시적인 텍스트 인코딩을 가지고 있어야하고 URL 다음에 서블릿 매개 변수를 다시 이진 이미지 데이터로 디코딩해야합니다 다시 게시됩니다.

+0

@BaluC : 캐시 등을 설정하는 데 너무 많은 시간을 소비하지 않고도 빠름이 빠릅니다. –

+1

@BalusC : OP에서 남긴 몇 가지 다른 의견을 볼 수있게되었으므로 그는 실제로 , 이미지 데이터를 HTML : 따옴표에 직접 붙여 넣으려고하면 "$ {part.photoData}는 초기 데이터베이스 호출에서 검색된 바이트 배열을 반환합니다." 그런 다음 그는 자신의 서블릿이 태그의 URL로 포함 된 바이트 배열을 추출하여 요청자에게 직접 돌려 줄 것으로 기대합니다. 나는 나의 설명에 대해 나는 꽤 분명하다고 생각했다. 그러나 다른 응답들 중 아무 것도 무슨 일이 일어나고 있는지를 알 수없는 것 같다. –

+0

오 그는 전체 이미지를 매개 변수로 전달하려고 시도했습니다!미안 해요. 지금 보죠. 나는 그것을 이미지 식별자로 해석했다. 나는 내 말을 되 찾는다. – BalusC

0

첫 번째 processRequest() 스 니펫은 photoData 요청 매개 변수의 바이트 표현만을 반환하며 매개 변수로 식별 된 사진 데이터는 반환하지 않습니다. 코드의 버그처럼 보입니다.

잘못된 방식으로 문제를 해결하려고하는 것 같습니다. HTML 테이블을 처음 생성 할 때 첫 번째 쿼리에서 "bean"에 이미지를 저장하면 데이터를 캐시하지 않는 한 아무 것도 얻을 수 없으며 displayThumbnail 요청은 데이터베이스 쿼리를 피하면서 캐시에서 이미지를 검색합니다.

캐싱을 망치고 싶지 않다면 아무것도주지 않으므로 이미지를 초기 빈에 저장할 필요가 없습니다. 두 번째 processRequest() 스 니펫과 같은 작업을 수행하면 이미지를 직접 가져올 수 있습니다. 브라우저가 요청합니다.

0

${part.photoData} 표현식에서 ID를 반환해야합니다. processRequest() 메소드에서 ID 값 (request.getParameter ("photoData") 사용)을 가져와 데이터베이스에서 이미지를 검색하거나 캐시 또는 파일 시스템에서 이미지를 가져 와서 이진 데이터를 웹 클라이언트로 전송해야합니다 .

+0

$ {part.photoData}는 초기 데이터베이스 호출에서 검색된 바이트 배열을 반환합니다. 나는 이미지 검색을 위해 별도의 데이터베이스 호출을하고 싶지 않다. –

+1

img 태그의 src 속성에 바이트 배열을 넣을 수 없습니다. 작동하지 않습니다. 그리고 데이터베이스를 호출하고 싶지 않다면 ID를 키로하고 바이트 배열을 값으로 가지는 맵을 유지할 수 있습니다. – user179437

관련 문제