代码之家  ›  专栏  ›  技术社区  ›  Karthikeyan

在smartGWT中打开/保存文件

  •  0
  • Karthikeyan  · 技术社区  · 14 年前

    我已经实现了RPCService、RPCServiceAsync&RPCServieImpl。单击一个按钮,服务器端的服务将被调用,它将从数据库中获取数据并创建文件。创建文件后,我需要在客户端打开该文件,并需要提示一个带有打开/保存选项的对话框。 如何实现打开文件部件。请建议一种方法来实施。。请回复。。提前谢谢。。。。

    @汉本德:我还有一个问题要澄清!。。如何在另一个servlet中调用这个doGet方法,即在我的onmodule load类中,我有很多小部件在单独的布局中,其中一个小部件是BUTTON?单击此按钮后,将调用服务RPCServiceImpl并完成所有操作,并在seroperate函数(public int GenerateFile(String name)()中创建文件)。如何使该函数调用doGet方法?因为doGet需要请求,所以响应参数要随它一起传递??请给我一个方法来调用那个方法。提前谢谢

    2 回复  |  直到 14 年前
        1
  •  5
  •   dslh    14 年前

    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();
        }
    }
    

    “contentdisposition:attachment”应该会导致大多数浏览器下载文件而不是显示它,文件名默认为您提供的任何文件。使用这个servlet的方法是让用户调用已经拥有的RPCService,它将文件保存到存储库文件夹中。然后,使用如下url将它们链接或重定向到此servlet http://your.domain.com/fileServlet?file=myFile.jpg

    您可能想做的是将RPC服务中的数据库代码合并到这个servlet中。无需将文件保存在服务器上的任何位置,您可以将数据库结果写入response.getOutputStream()或response.getWriter(),方法与写入文件的方法完全相同,只是结果会直接发送给用户。只要您正确设置了内容头,用户就不会注意到差异。

    <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()获取。然后在客户端,您可以创建到文件的普通html链接:

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

    ……或者,你 能够将其放入ClickHandler(我还没有测试过):

    Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename);
    
        2
  •  0
  •   Romain Hippeau    14 年前