2011-08-24 4 views
1

gwt 웹 앱의 clickevent에서 파일 다운로드를 시작하고 싶습니다. 그래서 출력에 데이터를 쓰고 다운로드를 시작해야하는 Servlet을 작성했습니다. 데이터는 http get를 통해 수신됩니다. 클라이언트의 서블릿에서 gwt (http get)를 통해 서블릿에서 다운로드 시작

public void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    String data = request.getParameter("data"); 
    String filename = request.getParameter("filename"); 
    byte[] streamData = data.getBytes(); 
    response.setContentType("application/force-download"); 
    response.setHeader("Content-Disposition", "attachment; fileName=" 
      + filename + ".csv"); 
    response.setContentLength(streamData.length); 

    ServletOutputStream out = response.getOutputStream(); 
    out.write(streamData); 
    out.flush(); 
} 

나는 requestBuilder.sendRequest()를 통해 get 메소드를 시작

RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, /download"); 
requestBuilder.sendRequest("filename=dues&data="+ theDataAsString, new RequestCallback() { 

        @Override 
        public void onResponseReceived(Request request, 
          Response response) { 
         // Anything to do here? 
        } 

        @Override 
        public void onError(Request request, Throwable exception) { 
         exception.printStackTrace(); 
         SC.warn("Error while creating export file."); 
        } 
       }); 

아무런 변화가 없습니다. 하지만 왜? 브라우저가 다운로드를 시작하도록 요청하지 않아야합니까?

게시물을 사용하거나 가져 오는 경우이 경우 문제가 되나요?

나는

Window.open("/download?data=myData&filename=filename", "_blank", ""); 

어떤 아이디어 같은 뭔가를해야만 사용하지 않으려는?

+0

서블릿은 검색된 요청 매개 변수를 응답 본문 (잘못된 문자 인코딩 포함)으로 반환하는 것 외에는 아무 것도하지 않습니다. 여기에 서블릿의 목적은 무엇입니까? 나는 GWT를하지 않지만, 왜 그 것을 직접적으로 작성하지 않습니까? – BalusC

+0

@BalusC : 모든 GWT Java 코드가 JavaScript로 변환되고'java.io. *'에 대한 지원이 없으므로 Servlet을 사용해야합니다. 하지만 인코딩이 옳았는데 제 경우에는 "text/csv"를 사용해야합니다. (하지만 실제로 "응용 프로그램/강제 다운로드"도 작동합니다.) – Simson

+0

Re GWT : 알았습니다. Re encoding : 아니,'String # getBytes()'와'HttpServletResponse # setCharacterEncoding()'에서 지정해야하는 문자 인코딩을 의미했다. 문자 인코딩을 지정하지 않으면 플랫폼 기본값이 사용되어 동일한 인코딩을 사용하여 원래 인코딩되지 않은 경우 문자를 조작 할 수 있습니다. – BalusC

답변

2

클라이언트 측에서는 요청 빌더 대신 앵커를 사용하고 직접 서블릿을 호출하십시오.

+0

그래, 그게 다야. 왜'requestBuilder.sendRequest()'가 작동하지 않았지만 Anchor가 작동하는지 모르겠습니다. 사실 나는 지금 앵커 대신 FormPanel과 포스트 메서드를 사용합니다 ... – Simson

관련 문제