2010-06-03 3 views
1

저는 J2EE에서 새로 개발되었습니다. 기존 응용 프로그램 (OpenSource 프로젝트)을 수정하려고합니다. 서버에서 보낸 클라이언트에 이미지를 저장해야하지만 어떻게해야할지 모르겠습니다. 이 액티비티는 애플리케이션의 기존 작업에 영향을 미치지 않으면 서 투명하게 수행되어야합니다.서블릿은 서버에서 이미지를 보내고 클라이언트에 저장합니다.

테스트에서 나는이 오류가 발생합니다. java.lang.IllegalStateException : getWriter()가 이미이 응답에 대해 호출되었습니다.

자신의 견해에 따라이 작업을 어떻게 수행해야합니까? 이미지를 로컬에서 클라이언트에 저장하려면 어떻게해야합니까?

업데이트 : 답변에 대한

감사합니다. , 사진이 인터넷에서 다른 서비스를 사용하여 구성되어

  1. 이미지가 서버에 생성되지만 직접적인 클라이언트 요청 (웹 페이지를 클릭 할 링크가 없음) : 내 문제가 있다는 것입니다.
  2. 서버에서 이미지를 재구성하십시오.
  3. 로컬로 저장하려면이 이미지를 클라이언트로 보내야합니다.
  4. 그래서 내가 목적지 이미지를 지정하는 창을 표시하고 싶습니다.
  5. 더하기이 애플리케이션의 나머지 부분이이 활동의 ​​영향을받지 않았 으면합니다.
  6. 응용 프로그램이 아직 생산 중입니다.

답변 해 주셔서 감사합니다.

답변

2

From the tests done I get this error: java.lang.IllegalStateException: getWriter() has Already Been Called for this response.

, 당신은 HTML 출력의 문자 데이터와 이미지의 바이너리 데이터를 혼합하려고했던, 또는 당신은 JSP 대신 서블릿에서이 작업을 수행하고있었습니다. 이것은 실제로 작동하지 않을 것입니다. 또는 이미지를 보낼 때는 을 완전히 분리하여 요청에 대한 응답으로 보내야합니다. 당신은 단지 몇 가지 데이터 소스에서 InputStream로 이미지를 얻을, /imageservlet/*url-pattern에서 수신 서블릿에서, 그리고

<a href="imageservlet/filename.gif">click to download image</a> 

: 당신의 JSP/HTML 페이지에서

는 너무 같은 이미지에 대한 링크를 가지고 (예 : 로컬 디스크 파일 시스템에서 FileInputStream)으로 입력 한 다음 응답의 OutputStream에 일반적인 Java IO 방법으로 씁니다.

는 당신은 다른 사람이 바로 브라우저에 표시되며, 클라이언트가 팝업 대화 같이 저장을 얻을 수 있는지 확인 attachment에 적어도 Content-Disposition 응답 헤더를 설정해야합니다. Content-TypeContent-Length을 설정하는 것은 브라우저가 서버에서 보내는 내용을 알고 다운로드 시간이 얼마나 걸릴지 예측하는 데 중요합니다.

response.setHeader("Content-Type", getServletContext().getMimeType(file.getName())); 
response.setHeader("Content-Length", String.valueOf(file.length())); 
response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\""); 

this article에서 완전한 기본 서블릿 예제를 찾을 수 있습니다.

참고 : 클라이언트가 이미지를 저장할 위치를 제어 할 수 없습니다. 보안 구멍이됩니다. 이렇게하면 웹 사이트에서 클라이언트의 디스크에 악의적 인 파일을 쓸모없이 쓸 수 있습니다.


업데이트 : 당신의 갱신에 따라, 두 가지 옵션이 있습니다 :

  1. 당신은 클라이언트에게 자체 불이 HTTP 요청을 할 필요가 (내가 your subsequent question이 대답했습니다)

  2. 모든 작업을 클라이언트 측에서 직접 수행 한 다음 웹 페이지에 삽입하십시오 (예 :).. 애플릿을 사용하면 클라이언트 환경을 완벽하게 제어 할 수 있습니다. 은 실행할 거의 모든 Java 코드를 실행할 수 있으며 클라이언트에게 저장할 위치를 묻지 않고 디스크에 직접 파일을 쓸 수 있습니다. 제 3 자 회사가 애플릿에 서명하기 만하면 클라이언트가 실행 전에 보안 경고를 확인해야합니다.

1

모든 종류의 출력이 처리되는 방식은 브라우저에 달려 있습니다. 웹 페이지는 브라우저가 이해할 수있는 html의 콘텐츠 유형이 주어지며 우리가 볼 수있는 페이지 렌더링을 끝냅니다. 이미지에는 페이지/등에서 이미지로 렌더링되는 이미지/jpeg 등의 콘텐츠 유형이 제공됩니다. 다운로드 프롬프트를 강제로 실행하려면 이미지의 내용 유형이 아닌 이진 파일의 내용 유형을 사용해야하므로 브라우저가 다운로드를 강제 수행합니다 이미지를 보여주는 것보다. "application/octetstream"과 같은 것을 사용하려면 ... 정확히 리콜 할 수는 없지만 Google에 쉽게 적용 할 수 있습니다. 즉

관련 문제