java - 在 smartGWT 中打开/保存文件

标签 java gwt smartgwt gwt-rpc

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

@Hambend:我还有一个澄清!...如何在另一个 servlet 中调用这个 doGet 方法,即在我的 onmodule 加载类中,我在单独的布局中有很多小部件,其中一个这样的小部件是 BUTTON ?单击此按钮时,将调用服务 RPCServiceImpl 并完成所有操作,并在蛇形函数中创建文件 (public intGenerateFile(String name)() )。如何让该函数调用 doGet 方法?因为 doGet 需要请求、响应参数一起传递?请建议我一种调用该方法的方法。提前致谢

最佳答案

GWT 的 RPC 服务只能将 java 对象发送回客户端。要将文件发送回用户,您需要使用非 GWT java servlet。这是我之前使用过的一些代码,用于从存储库提供 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();
    }
}

“内容处置:附件”应该会导致大多数浏览器下载文件而不是显示文件,文件名默认为您提供的文件名。使用此 servlet 的方法是让用户调用已有的 RPCService,这会将文件保存到存储库文件夹中。然后,您可以使用诸如 http://your.domain.com/fileServlet?file=myFile.jpg 之类的 url 将它们链接或重定向到此 servlet。 。显然,使用此设置会存在安全风险,如果用户可以猜测文件名,他们就可以下载其他人的文件。

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

您不能从另一个 servlet 调用此方法,使浏览器将其作为文件下载的唯一方法是通过普通的 HTTP 请求访问它。首先,您在 web.xml 文件中声明 servlet,就像声明 GWT RPC 服务一样:

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

关于java - 在 smartGWT 中打开/保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3053462/

相关文章:

java - 抑制 JSP 文件中的 Java 未检查警告

java - 从列表中删除、添加和使用项目

java - 如何解决应用程序中加载单选按钮选择的延迟?

java - 关于 GWT base Url 的问题

bandwidth - SmartGWT、ZK 和 GenericFrame - 在线作业

java - 我的网络应用程序如何在加载时清除浏览器缓存?

java - 使用 AXIS2 从 SOAP 响应中提取 cookie

java - 使用不带 -javaagent 参数的 ByteBuddy Java 代理

gwt - 如何使用 Google Web Toolkit 绘制图表?

java - SmartGWT 与 GWT?