2008-09-29 2 views
2

나는 Struts 2.1.2와 Hibernate 3.2.6.GA를 사용하여 웹 애플리케이션을 개발 중이다. 엔티티가 User이고 최대 절전 모드를 사용하는 DB에 USERS 테이블로 매핑되었습니다. DB에 BLOB으로 저장하려는이 엔티티와 관련된 이미지를 갖고 싶습니다. 또한 User의 다른 속성과 함께 웹 페이지에 이미지를 표시하려고합니다.Struts 2 + Hibernate 3을 사용하여 이미지를 브라우저에 제공하는 방법은 무엇입니까?

내가 생각할 수있는 해결책은 IMAGES(ID, IMAGE)IMAGEBLOB 인 테이블을 갖는 것입니다. USERS은 테이블을 가리키는 IMAGEID이라는 FK 열을 갖습니다. 그러면이 IMAGEID에 매핑 된 imageId이라는 엔티티를 User 엔티티에 매핑 할 것입니다. JSP로 페이지를 렌더링 할 때, 이미지를 <img src="images.action?id=1"/> 등으로 추가하고, 이미지를 읽고 브라우저에 컨텐츠를 스트리밍하는 헤더가있는 이미지를 오랫동안 캐시하도록 설정 한 액션이 있습니다.

이 방법이 유용할까요? DB에 저장된 이미지를 렌더링하는 더 좋은 방법이 있습니까? DB에 이러한 이미지를 저장하는 것이 처음부터 올바른 접근 방식입니까?

답변

4

예 제안 된 솔루션이 작동합니다. 데이터베이스 환경에서 이미지를 저장하는 Java 환경에서 작업하는 것이 가장 좋은 방법입니다. 기술적으로 분해 된 형식으로 배포 할 수있는 응용 프로그램 서버가있는 단일 서버 환경에서 실행중인 경우 이미지를 디스크에 저장할 수는 있지만 최상의 방법은 아닙니다. 한 가지 제안은 JSP 대신 서블릿을 사용하는 것입니다. 좋은 브라우저 동작을 얻으려면 브라우저가 표시하고있는 파일 형식이 예상하는 파일 형식과 일치한다고 생각하게합니다. MIME 형식 헤더가 있지만 파일 확장은 여전히 ​​중요합니다. 따라서 다음과 같은 링크가 필요합니다.

<a href="foo.jsp"><img src="imageservlet/123456789.png"></a> 

여기서 123456789는 데이터베이스에있는 이미지의 기본 키입니다. 서블릿 매핑은 다음과 같을 것이다 :

<servlet> 
    <servlet-name>ImageServlet</servlet-name> 
    <servlet-class>com.example.ImageServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ImageServlet</servlet-name> 
    <url-pattern>/imageservlet/*</url-pattern> 
</servlet-mapping> 

그런 다음 서블릿 단순히 오히려 일부 브라우저를 혼란스럽게한다 쿼리 문자열로 쿼리 문자열을 사용하는 것보다 이미지 ID에 대한 요청의 URL을 구문 분석합니다.쿼리 문자열을 사용하면 브라우저가 완전히 중단되지는 않지만 캐싱과 관련하여 이상한 행동을 보일 수 있으며 일부 브라우저는 내용이 안전하지 않다고보고 할 수 있습니다.

+0

이 메커니즘을 사용하여 구현했습니다 (서블릿 대신 ServletResponseAware 작업 사용). 나는 다른 메커니즘이 생길 수 있기를 희망하는 대답으로 이것을 골라 내지 않을 것이다. 나는 이것이 지금까지 가장 잘 알려진 대답이기 때문에 이것을 upvoted했습니다. –

0

사용자 이미지를 속성과 함께 직접 표시하려는 경우 이미지 데이터를 HTML에 직접 포함시킬 수 있습니다. 특별한 데이터를 사용하여

: 당신이 HTML 페이지 내부의 마임 데이터를 포함 할 수있는 URL 방식, 형식은 다음과 같다 :

data:<mimetype>;base64,<data> 

필요가 마임으로 대체 할 수 형식의 데이터 (예 : 이미지/png) 및 은 파일의 실제 바이트를 기준으로 인코딩 된 64 바이트 문자열입니다.

RFC 2557을 참조하십시오.

Example

:

<img src="data:image/png;base64,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"> 
+0

방금 ​​버전 8이 출시 될 때까지 IE에서 작동하지 않는다는 것을 읽었습니다. 또한 이미지는 브라우저에 캐시되지 않습니다. 따라서 코딩의 용이함에도 불구하고 필자는 원래의 방식을 사용할 것이라고 생각합니다. –

+0

또한 이러한 문자열의 길이에 (실제로 엄격한) 제한이 있음을 기억하십시오. 1k 문자부터 브라우저에 따라 100k까지. –

0

Internet Explorer에서 이미지 삽입의 스타일을 지원하지 않습니다.

+0

IE7에서 http://rifers.org/blogs/gbevin/2005/4/11/embedding_images_inside_html을 테스트 한 결과 제대로 작동합니다. –

+0

Geert의 게시물에있는 이미지가 IE6/WinXP에 표시되지 않습니다. –

0

제안 된 솔루션은 완벽하게 작동합니다. 나는 똑같은 짓을 했어.

하지만 서블릿이 필요하지 않습니다. Struts2는 이미 스트림 결과를 가지고 있습니다.

정확한 내용을 설명하는 Struts 2 Example을 참조하십시오.

관련 문제