2013-02-05 2 views
0

호출시 Open/Save 대화 상자를 시작하기 위해 호출해야하는 Spring 3 프레임 워크 webapp에서 다운로드 컨트롤러를 구현했습니다.Spring 3 MVC - 브라우저에서 내 다운로드가 .htm 파일이라고 생각합니다.

사실 열기/저장 대화 상자가 나타나고 저장이 제대로 작동합니다. 그러나 열기를 클릭하면 내 파일 이름에 ".htm"이 추가되고 잘못 표시됩니다. 왜?

컨트롤러 :

@RequestMapping("download/downloadFile") 
    @ResponseBody 
    public byte[] downloadFile(@RequestParam String fileID, HttpServletResponse response) { 

     response.setContentType("application/octet-stream"); 
     File file = getFileByID(fileID);      

     byte[] bytes = FileCopyUtils.copyToByteArray(file); 

     response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");  
     response.setContentLength(bytes.length); 

     return bytes; 
    } 

나는 응답 헤더 내가 볼 참조

컨텐츠 유형이 text/html과, 내 응용 프로그램/octet-stream을로 설정 무시처럼!

Cache-Control no-cache, no-store 
Connection close 
Content-Disposition attachment; filename="test.txt" 
Content-Length 22071 
Content-Type text/html 
Date Tue, 05 Feb 2013 21:12:20 GMT 
Expires Thu, 01 Jan 1970 00:00:00 GMT 
Pragma no-cache 
Server Apache/2.2.10 (Linux/SUSE) 
X-Powered-By Servlet/2.5 JSP/2.1 
X-UA-Compatible IE=8, chrome=1 

아마도 web.xml에서 스프링 MVC를 설정 한 방법 때문일 수 있습니까?

<servlet-mapping> 
    <servlet-name>springmvc</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

모든 것이 ".html"로 끝나는 URL로 매핑되고 브라우저가이를보고 있습니까?

+0

'getFileByID (fileID)'는 저장소 메소드입니까? 실제로'file.getName()'에 의해 반환되는 것은 무엇입니까? 추적 할 때 무엇이 ​​보이나요? 'System.out.println (file.getName());'을 실행하고 서버 콘솔에서 생성 된 내용을 확인하십시오. – Lion

+0

java.io.File 객체를 반환하는 것이 적절한 방법이므로 getName() 메서드는 Java의 IO 라이브러리에서 가져온 것이고 "test.txt"를 반환합니다 (그러나 txt 파일은 이미지/PDF를 시도 할 때 최상의 샘플이 아닙니다. 파일에 올바른 파일 이름이 표시됨) – Trant

+0

클라이언트 쪽에서 어떤 헤더를 지정 했습니까? JSON을 다루므로 헤더 : { 'Accept': 'application/json', 'Content-Type': 'application/json' } '이어야합니다. 응답 헤더는 사용자가 지정한대로 적절합니다. – Lion

답변

0

응답을 생성하는 데 두 가지 스타일을 혼합합니다. 응답에 직접 작성하고, 응답 바디에 메소드의 반환 값을 작성하도록 Spring에 요청한다. 현재 가지고있는 것처럼 프레임 워크가 응답 내용 유형을 덮어 씁니다. 일반적으로 응답의 콘텐츠 유형은 주석의 produces 속성으로 언급 할 수 있습니다. 그러나이 경우 콘텐츠 처리 헤더를 쓰고 싶기 때문에 @ResponseBody 주석 대신 사용자 정의보기를 사용하는 것이 좋습니다.

사용자 정의보기 클래스에서 원하는 헤더를 설정 한 다음 직접 바이트를 응답 출력 스트림으로 스트리밍하십시오.

희망이 도움이됩니다.