【发布时间】:2011-02-18 20:13:30
【问题描述】:
我有一个 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;
}
}
我在互联网上的某个地方读到过,您不能使用 RPC 进行文件流处理,因此我必须使用 Servlet。是否有任何关于如何使用 Servlet 以及如何从 ReportsServiceImpl 调用该 servlet 的示例。我真的需要制作一个 servlet 还是可以通过我的 RPC 将其流式传输回来?
【问题讨论】:
-
请详细说明问题。 “它不知道”并不是真正的描述性。究竟会发生什么?究竟发生了什么?
-
@sri 的回答很有道理。现在轮到我发布一些 cmets:1)
DataInputStream是多余的。直接使用FileInputStream。毕竟您只需要InputStream类中定义的read()方法。 2)in != null检查也是多余的,因为它 never 为空(您使用new创建了新的检查,它永远不能为空)。 3)Content-Disposition标头在filename部分中看起来格式不正确。要了解如何进行 basic 文件服务,您可能会发现 this article 很有用。祝你好运。