使用Java在浏览器中下载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 ),因此它inheritance了它的“写”方法,所以在一个理想的世界里我想简单地说“outStream.write(file);”,但我不能这样看,因为这些“写”方法只有byte,byte []和int作为参数,并且不可能将文件传递给它们。

我该怎么做才能将文件传递到outStream?

(另请注意:我应该在“_response.setContentLength();”中添加它,如果是这样,我应该在其中放入哪些参数?)

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

您可以逐行读取CSV文件,并在HttpSerlvetResponseWriter上写下该行:

 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(); } } } 

如果同时使用ReaderWriter ,则将处理字符编码(CSV文件是编码类似于UTF-8的文本文件)。

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