Java文件下载代码设计问题

时间:2011-08-19 18:38:08

标签: java

我有一个Java项目,用作webapp中的一个组件。此java代码将xls文件写入特定文件夹中。我想为这个文件提供一个下载功能,一旦文件写入完成就应该触发。 问题是 - 没有服务器环境,如何编写下载功能?

2 个答案:

答案 0 :(得分:4)

不要写入特定文件夹中的文件。只需立即写入HTTP响应正文。下载工作应该只在webapp的代码中完成。我假设你正在使用Servlets。如果您将HTTP响应Content-Disposition标头设置为attachment,则浏览器将弹出另存为对话框。如果您还设置了Content-Type标题,那么浏览器将了解如何处理它(例如,它将能够询问您要在Excel中打开它还是要保存?等等。)

response.setHeader("Content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

// Now write xls to response.getOutputStream() instead of FileOutputStream.

如果该Java项目的API设计得很好,那么你应该有一个像这样的方法:

public void writeXls(OutputStream output) throws IOException {
    // Do your job to write xls to output. E.g. if you were using POI HSSF:
    // WritableWorkbook workBook = Workbook.createWorkbook(output);
    // ...
}

这样你可以在设置上述标题之后在servlet中调用它,如下所示

yourClass.writeXls(response.getOutputStream());

更重要的是,它可以在普通的Java应用程序中轻松地重用/测试,如下所示:

yourClass.writeXls(new FileOutputStream("/path/to/foo.xls"));

答案 1 :(得分:1)

我就是这样做的。我在我的页面中显示了一个下载sql。

response.setHeader("Content-Disposition", "attachment; " +
    "filename=ContactPurge.sql");
response.setContentType("application/x-sql-data");
response.getWriter().write(procsql);
response.getWriter().write(sql);
response.flushBuffer();