使用Java在浏览器中下载CSV文件

时间:2013-08-07 10:01:39

标签: java servlets csv

我正在尝试在Web应用程序上添加一个按钮,当单击该按钮时,会下载一个CSV文件(很小,只有大约4KB)。

我已经制作了按钮并附加了一个监听器。该文件也准备好了。 我现在唯一需要做的就是创建在单击按钮时下载csv文件的实际事件。

假设“file”(类型为File)是我正在使用的csv文件的名称,并且它已经准备好了,这是我到目前为止的方法:

public void downloadCSV(HttpServletRequest _request, HttpServletResponse _response, LogFileDetailCommand cmd) throws Exception {
     ServletOutputStream outStream = _response.getOutputStream();
     _response.setContentType("text/csv");  
     _response.setHeader("Content-Disposition", "attachment; filename=data.csv");
}

我意识到我错过了将文件写入ServletOutputStream的部分,但这是我坚持的部分。我知道类ServletOutputStream扩展了类OutputStream(http://docs.oracle.com/javaee/5/api/javax/servlet/ServletOutputStream.html),因此它继承了它的“写”方法,所以在理想的世界中我想简单地说“outStream.write(file);”,但是我不能这样看,因为这些“写”方法只有byte,byte []和int作为参数,并且不可能将文件传递给它们。

如何将文件传递到outStream?

(旁注:我应该在“_response.setContentLength();”中添加它,如果是这样,我应该在其中添加什么参数?)

P.S。我知道在完成outStream之后我需要刷新和/或关闭它。

1 个答案:

答案 0 :(得分:2)

您可以逐行阅读CSV文件,并在Writer的{​​{1}}上写下这一行:

HttpSerlvetResponse

如果同时使用public class DownloadCsvServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final File file = new File("/tmp/data.csv"); response.setContentType("text/csv"); response.setHeader("Content-Disposition", "attachment; filename=" + file.getName()); final BufferedReader br = new BufferedReader(new FileReader(file)); try { String line; while ((line = br.readLine()) != null) { response.getWriter().write(line + "\n"); } } finally { br.close(); } } } Reader,则会处理字符编码(例如,CSV文件是编码方式为UTF-8的文本文件)。

此解决方案,因此只有一小部分可能很大的文件存在于内存中。