我正在使用struts来开发我的Web应用程序。我写了一个生成excel文件的方法,并根据我传递的数据模型保存它。由于tomcat在本地存在,在我的本地机器上工作得很好..但是现在我已将我的应用程序移动到中央服务器..现在如果我使用它存储的方法在服务器中生成excel文件,而不是在服务器上的客户端机器中生成。我需要通过http将它从服务器传递给客户端。我该怎么办?
public static void populateExcelDoc(List<ColumnList> listOfColumns,RowList rowlist,String filename)
{
try
{
WorkbookSettings ws = new WorkbookSettings();
ws.setLocale(new Locale("en", "EN"));
WritableWorkbook workbook = Workbook.createWorkbook(new File(filename+".xls"), ws);
WritableSheet s = workbook.createSheet("Sheet1", 1);
writeDataSheetifx1(s,listOfColumns,rowlist);
workbook.write();
workbook.close();
Process p =
Runtime.getRuntime()
.exec("rundll32 url.dll,FileProtocolHandler " + filename+".xls");
}
catch(IOException e)
{
e.printStackTrace();
}
catch(WriteException e)
{
e.printStackTrace();
}
}
这就是我目前的代码。我需要做出哪些改变?我应该使用HttpServletResponse响应吗?
答案 0 :(得分:2)
在Struts2中,有stream
结果将数据发送到HttpServletResponse。
在struts.xml
配置您的操作以使用stream
结果。
<action name="exceldoc" method="populateExcelDoc" class="ExcelDocAction">
<result name="success" type="stream">
<param name="inputName">inputStream</param>
<param name="contentType">application/vnd.ms-excel</param>
<param name="contentDisposition">attachment;filename=excel.xls</param>
</result>
</action>
在您的操作中,使用getter / setter创建private InputStream inputStream;
并在您的方法中将文件写入其中。
答案 1 :(得分:1)
您有几种选择,其中两种是:
1)将文件保存在客户端浏览器可以访问的位置
要做到这一点,你必须找到一个体面的目录来存储文件。使用Servlet时,可以使用此方法从相对URL路径创建绝对文件系统路径:
String filePath = getServletContext().getRealPath("/MyFile.xls");
WritableWorkbook workbook = Workbook.createWorkbook(new File(filePath), ws);
...
然后,用户可以使用以下网址从浏览器访问它:http://host:port/AppName/MyFile.xls
您还可以修改响应标头,以便浏览器必须读取文件:
response.setHeader("Content-Disposition", "attachment;filename=/MyFile.xls");
这种方法的缺点是每个人都可以访问该文件,如果有多个用户反复生成该文件,您可能必须考虑生成唯一的文件名。然后,您还必须为旧文件实现删除例程。
2)将文件直接从servlet发送到浏览器。
如果Servlet请求的响应可以是创建的Excel文件,这可能是最好的方法。
根据文件类型和大小设置响应标头:
response.setContentLength(length);
response.setContentType("application/vnd.ms-excel");
response.getOutputStream().write(...);
response.getOutputStream().flush();
写入数据后,可以从服务器文件系统中删除该文件。