我有一个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将其流回来?
DataInputStream
是多余的。只需使用直接的FileInputStream
即可。毕竟,您仅需要在InputStream
类中定义的read()
方法。2)in!= null
检查也是多余的,因为它永远不会为空(您使用new
创建了一个新的对象,它永远不会为空)。3)Content-Disposition
头在filename
部分看起来格式不正确。要获取有关如何进行基本文件服务的一些想法,您可能会发现此文章有用。祝你好运。 - BalusC