java – 使用GWT下载动态文件

我有一个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,length);
            }

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

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

        return "Server says: " + filename;
    }
}

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

解决方法

你必须做一个常规的Servlet,你不能从ReportsServiceImpl流二进制数据.此外,没有办法从ReportsServiceImpl调用servlet – 您的客户端代码必须直接调用servlet.

在客户端,您必须使用通过查询字符串传递的参数创建一个正常的锚点链接.像< a href =“http://myserver.com/myservlet?parm1 = value1& ..”< / a&gt ;. 在服务器端,将您的代码移动到标准的Servlet,而不是从RemoteServiceServlet继承.从请求对象读取参数,创建excel并将其发送回客户端.浏览器将自动弹出文件下载对话框.

相关文章

背景 阿里java开发规范是阿里巴巴总结多年来的最佳编程实践,...
# 前言 在面试这一篇我们介绍过[CountDownLatch和CyclicBarr...
多线程编程是每一个开发必知必会的技能,在实际项目中,为了...
背景 在我们系统中有这么一个需求,业务方会通过mq将一些用户...
# 前言 为了更好的进行开发和维护,我们都会对程序进行分层设...
前言 关于动态代理的一些知识,以及cglib与jdk动态代理的区别...