Struts 2 + Hibernate 3을 사용하여 브라우저에 이미지를 어떻게 제공 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/151100

  •  02-07-2019
  •  | 
  •  

문제

Struts 2.1.2 및 Hibernate 3.2.6.ga를 사용하여 웹 응용 프로그램을 개발 중입니다. 나는 단체가 있고 User, 나는 테이블에 매핑했다 USERS 최대 절전 모드를 사용하여 DB에서. 나는이 엔티티와 관련된 이미지를 원한다. BLOB DB에서. 또한 웹 페이지에 이미지를 다른 속성과 함께 표시하고 싶습니다. User.

내가 생각할 수있는 해결책은 테이블을 갖는 것이 었습니다. IMAGES(ID, IMAGE) 어디 IMAGE a BLOB 열. USERS 가질 것입니다 FK 열이 호출됩니다 IMAGEID, 그것은 그것을 가리킨다 IMAGES 테이블. 그런 다음 재산을 맵핑하겠습니다 User 엔티티, 호출 imageId 이것에 매핑되었습니다 IMAGEID 길다. JSP로 페이지를 렌더링 할 때 이미지를 다음과 같이 추가합니다. <img src="images.action?id=1"/> 등, 이미지를 읽고 컨텐츠를 브라우저로 스트리밍하는 동작을 가지고 있으며 헤더가 이미지를 오랫동안 캐시하도록 설정했습니다.

이것이 효과가 있습니까? DB에 저장된 이미지를 렌더링하는 데 더 나은 접근 방식이 있습니까? 그러한 이미지를 DB에 저장하는 것이 처음에 올바른 접근 방식입니까?

도움이 되었습니까?

해결책

예, 제안 된 솔루션이 작동합니다. 데이터베이스에 이미지를 저장하는 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을 구문 분석합니다. 쿼리 문자열을 사용하면 브라우저가 완전히 깨지지 않지만 캐싱과 관련하여 이상한 동작이 발생하며 일부 브라우저는 콘텐츠를 안전하지 않은 것으로보고 할 수 있습니다.

다른 팁

Internet Explorer는 해당 스타일의 이미지 임베딩을 지원하지 않습니다.

속성으로 사용자 이미지를 직접 표시하려면 HTML에 이미지 데이터를 직접 포함시키는 것을 고려할 수 있습니다.

특수 데이터 사용 : URL 구성표 HTML 페이지에 MIME 데이터를 포함시킬 수 있으면 형식은 다음과 같습니다.

data:<mimetype>;base64,<data>

데이터의 마임 유형 (예 : 이미지/PNG)으로 대체하고 파일의 실제 바이트의 Base64 인코딩 문자열입니다.

보다 RFC 2557.

예시:

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

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

그러나 당신은 이것을 위해 서블릿이 필요하지 않습니다. Struts2는 이미 스트림 결과를 가지고 있습니다.

이것 좀 봐 Struts 2 예 원하는 것을 정확하게 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top