使用GWT下载动态文件

Mak*_*sim 9 java gwt rpc servlets

我有一个GWT页面,用户输入数据(开始日期,结束日期等),然后这些数据通过RPC调用进入服务器.在服务器上,我想生成带有POI的Excel报告,并允许用户将该文件保存在本地计算机上.

这是我将测试代码流回客户端的测试代码,但出于某种原因,我认为当我使用RPC时,它不知道如何将文件传输到客户端:

public class ReportsServiceImpl extends RemoteServiceServlet implements ReportsService {
    public String myMethod(String s) {

        File f = new File("/excelTestFile.xls");

        String filename = f.getName();

        int length = 0;

        try {
            HttpServletResponse resp = getThreadLocalResponse();
            ServletOutputStream op = resp.getOutputStream();
            ServletContext context = getServletConfig().getServletContext();
            resp.setContentType("application/octet-stream");
            resp.setContentLength((int) f.length());
            resp.setHeader("Content-Disposition", "attachment; filename*=\"utf-8''" + filename + "");

            byte[] bbuf = new byte[1024];
            DataInputStream in = new DataInputStream(new FileInputStream(f));

            while ((in != null) && ((length = in.read(bbuf)) != -1)) {
                op.write(bbuf, 0, length);
            }

            in.close();
            op.flush();
            op.close();

        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

        return "Server says: " + filename;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在互联网上的某个地方读过你不能用RPC做文件流,我必须使用Servlet.有没有关于如何使用Servlet以及如何从ReportsServiceImpl调用该servlet的示例.我是否真的需要制作一个servlet,或者可以使用我的RPC将其传回去?

Sri*_*nan 14

你必须制作一个常规的Servlet,你不能从中传输二进制数据ReportsServiceImpl.此外,无法从ReportsServiceImpl调用servlet - 您的客户端代码必须直接调用servlet.

在客户端,您必须使用通过查询字符串传递的参数创建常规锚链接.有点像<a href="http://myserver.com/myservlet?parm1=value1&.."</a>.

在服务器端,将代码移动到标准的Servlet,不会继承RemoteServiceServlet.从请求对象中读取参数,创建excel并将其发送回客户端.浏览器将自动弹出文件下载对话框.