2013-08-16 3 views
4

내 페이지에 다운로드 링크가 있습니다. 정상적으로 작동하지만 내 페이지는 새로 고침/리디렉션되지 않습니다. 여기 내 코드가있다.봄 - 파일 다운로드 및 리디렉션

@RequestMapping(method = RequestMethod.POST, params = "exportToXML") 
public String exportToXML(HttpServletResponse response, Model model, @ModelAttribute(FILTER_FORM) ScreenModel form, 
     BindingResult result, OutputStream out, 
     HttpSession session) throws IOException { 
    ZipOutputStream zipout; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 


     zipout = new ZipOutputStream(baos); 
     ZipEntry ze = new ZipEntry("file.xml"); 
     zipout.putNextEntry(ze); 
     zipout.write(string.getBytes()); 
     zipout.closeEntry(); 
     zipout.close(); 
     baos.close(); 


    response.setContentType("application/vnd.ms-excel"); 
    response.setHeader("Content-disposition", "attachment; filename=xx.zip"); 
    response.getOutputStream().write(baos.toByteArray()); 
    response.getOutputStream().close(); 
    response.getOutputStream().flush(); 
    return VIEW_NAME; 
} 

나는 조금 더 짧게하기 위해 관련성없는 코드를 제거했습니다. @ResponseBody로 시도했지만 위의 코드와 동일한 결과를 제공합니다. 조언이 도움이 될 것입니다.

답변

7

파일을 다운로드하고 새로 고침/리디렉션 할 수 없습니다. 원인을 설명하려고합니다. 요청 흐름은 다음 그림과 같습니다. enter image description here

노란색 원은 컨트롤러입니다. 프런트 컨트롤러가 뷰 이름을 반환하면 적절한 뷰 템플릿 (구성된 뷰 확인자에 따라 jsp, 타일 또는 기타)이 응답을 받고 HTML (또는 HTML이 아닌) 코드가 생성됩니다. 그 행동 스프링 열 수 없습니다 응답 한

response.getOutputStream().write(baos.toByteArray()); 
response.getOutputStream().close(); 
response.getOutputStream().flush(); 

와 (당신이 전에 그것을 할 수 있기 때문에) 거기에 새로 페이지를 쓰기 : 귀하의 경우에는

당신은 작업을 수행합니다.

public void exportToXML(HttpServletResponse response, Model model, @ModelAttribute(FILTER_FORM) ScreenModel form, 
     BindingResult result, OutputStream out, 
     HttpSession session) throws IOException { 

마지막으로 "VIEW_NAME를 돌려"삭제 : 그래서 당신은 당신의 방법 서명을 변경할 수 있습니다. 아무것도 변경되지 않습니다. 당신이 할 수있는

1

그렇지 않습니다. 브라우저가 새 창에서 ms-excel contentType을 열거 나 다운로드 프롬프트가 표시됩니다. 다운로드를 시작한 페이지는 리디렉션 또는 페이지 전환을 처리 할 수 ​​없습니다.

다운로드 + 페이지 새로 고침이 필요한 경우 JavaScript 기능이 다운로드를 시작하고 사용자에게 다음 페이지로 안내 할 수 있습니다.이 페이지는 '다운로드가 곧 시작됩니다'또는 유사 할 수 있습니다.

3

: "인덱스"

response.setHeader("Refresh", "1; url = index"); 

이 URL에 응답 한 후 일초 후 페이지를 새로 고칩니다.

0

다운로드 후 컨트롤러에 제출할 자바 스크립트 함수를 호출하면 다른 페이지가 표시 될 수 있습니다.

관련 문제