2010-06-16 3 views
0

RPCService, RPCServiceAsync & RPCServieImpl을 구현했습니다. 버튼을 클릭하면 서버 측의 서비스가 호출되어 DB에서 데이터를 가져오고 파일이 생성됩니다. 일단 파일이 생성되면 클라이언트 측에서 해당 파일을 열고 열기/저장 옵션으로 대화 상자를 프롬프트해야합니다. 이 파일 부분을 어떻게 구현할 수 있습니까? pls는 t를 구현하는 방법을 제안합니다 .. 대답 pls .. 미리 감사드립니다 ....smartGWT에서 파일 열기/저장

@ Hambend : 난 아직 하나 이상의 설명이! .. 어떻게 다른 서블릿 에서이 doGet 메서드를 호출하려면 내 onmodule로드 클래스 나는 별도의 레이아웃에 위젯을 많이 가지고 있고 하나 같은 위젯은 버튼입니까? 이 버튼 서비스 onclicking RPCServiceImpl이 호출되고 모든 조작이 완료되고 파일이 serperate 함수로 작성됩니다 (public int GenerateFile (String name)()). doGet 메서드를 호출하는 함수를 만드는 방법? doGet은 요청과 함께 전달되어야하는 응답 매개 변수가 필요하기 때문에? pls 그 방법을 호출하는 방법을 제안합니다. 미리 감사드립니다.

+0

클라이언트 측에 저장해야합니까, 아니면 서버 측에 저장할 수 있습니까? 클라이언트 측의 문제는 로컬 파일 시스템을 조작 할 수 있도록 브라우저의 샌드 박스를 얻는 것입니다. –

답변

5

GWT의 RPC 서비스는 자바 객체를 클라이언트로 다시 보낼 수 있습니다. 파일을 다시 사용자에게 보내려면 GWT가 아닌 java 서블릿을 사용해야합니다. 이전에 저장소에서 jpeg 이미지를 제공하기 위해 사용했던 몇 가지 코드가 있습니다.

public class ImageServlet extends HttpServlet { 
    private final String repository = "/var/images/"; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     String filename = request.getParameter("file"); 

     // Security: '..' in the filename will let sneaky users access files 
     // not in your repository. 
     filename = filename.replace("..", ""); 

     File file = new File(repository + filename); 
     if (!file.exists()) 
      throw new FileNotFoundException(file.getAbsolutePath()); 

     response.setHeader("Content-Type", "image/jpeg"); 
     response.setHeader("Content-Length", String.valueOf(file.length())); 
     response.setHeader("Content-disposition", "attachment;filename=\"" + filename + "\""); 

     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 
     BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); 
     byte[] buf = new byte[1024]; 
     while (true) { 
      int length = bis.read(buf); 
      if (length == -1) 
       break; 

      bos.write(buf, 0, length); 
     } 
     bos.flush(); 
     bos.close(); 
     bis.close(); 
    } 
} 

"내용 - 처리 : 첨부 파일"대부분의 브라우저 파일 이름은 당신이 제공하는 무엇을 디폴트로, 대신을 표시하는 파일을 다운로드하게한다. 이 서블릿을 사용하는 방법은 사용자가 이미 가지고있는 RPCService를 호출하게하여 파일을 저장소 폴더에 저장합니다. 그런 다음 http://your.domain.com/fileServlet?file=myFile.jpg과 같은 URL로이 서블릿에 연결하거나 리디렉션합니다. 분명히이 설정을 사용하면 사용자가 파일 이름을 추측 할 수있는 경우 다른 사용자의 파일을 다운로드 할 수있는 보안 위험이 있습니다.

RPC 서비스의 데이터베이스 코드를이 서블릿에 병합하는 것이 좋습니다. 서버에 파일을 저장할 필요가 없습니다. 데이터베이스 결과를 가져 와서 결과를 얻는 것을 제외하고는 파일에 쓰는 것과 정확히 같은 방식으로 response.getOutputStream() 또는 response.getWriter()에 쓸 수 있습니다. 바로 사용자에게. 콘텐츠 헤더를 올바르게 설정하면 사용자는 그 차이를 알 수 없습니다.

다른 서블릿에서이 메서드를 호출 할 수는 없지만 브라우저에서 파일을 다운로드하도록하는 유일한 방법은 일반 HTTP 요청을 통해 해당 메서드에 액세스하는 것뿐입니다. 첫째로 당신은 당신이하고자했다 GWT의 RPC 서비스처럼 web.xml 파일에 서블릿을 선언

<servlet> 
    <servlet-name>ImageServlet</servlet-name> 
    <servlet-class> 
     com.package.ImageServlet 
    </servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ImageServlet</servlet-name> 
    <url-pattern>/imageServlet</url-pattern> 
</servlet-mapping> 

을 이제 모든 HTTP GET http://your.tomcat.server/webapp/imageServlet에가는 ImageServlet.doGet에 의해 발탁 요구의(). (나는 그것을 테스트하지 않은 경우) 당신 경우 clickHandler에 넣고 할 수 있어야

new HTML("<a href='" + GWT.getHostPageBaseURL() + "imageServlet?file=" + filename + "'>download</a>"); 

... 나 : 그런 다음 클라이언트 측에서 해당 파일에 일반 HTML 링크를 만들 수 있습니다 :

Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename); 
+0

덕분에 많은 hambend .. 아직도 내가 hav 하나 더 설명을! pls는 그것을 취소 .. 다른 서블릿 에서이 doGet 메서드를 호출하는 방법?내 onmodule로드 클래스에서 나는 별개의 레이아웃에 위젯을 많이 가지고 있고 위젯 하나는 버튼입니까? 이 메서드를 호출하는 onclick 버튼 항목을 트리거하는 방법 ?? – Karthikeyan

+0

서블릿 사용법을 명확히하기 위해 필자의 대답을 편집했습니다. – dslh

+0

많이 고마워 .... .... 내가 일하고있어 ... 고마워 .. – Karthikeyan

0

파일이 텍스트 인 경우 항상 문자열 배열이있는 객체로 되돌아갑니다.
바이너리의 경우, 클래스 내의 byte []는 간단하게 행한다.