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

使用Java在浏览器中下载CSV文件,java,servlets,csv,Java,Servlets,Csv,我试图在一个web应用程序上添加一个按钮,当点击该按钮时,它会下载一个CSV文件(这个文件很小,只有4KB大小) 我已经制作了按钮,并附加了一个侦听器。文件也准备好了。 我现在需要做的唯一一件事就是创建一个实际的事件,在单击按钮时下载csv文件 假设“file”(类型为file)是我正在使用的csv文件的名称,并且它已准备就绪,这就是我目前使用的方法: public void downloadCSV(HttpServletRequest _request, HttpServletResponse

我试图在一个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(),因此它继承了它的“write”方法,所以在理想情况下,我只想说“outStream.write(file);”,但我不能这样做,因为这些“write”方法只有byte、byte[]和int作为参数,而且不可能把文件传给他们

我应该怎么做才能将文件传递到扩展流中

(旁注:我应该在“_response.setContentLength();”中添加此项吗?如果是,我应该在其中添加哪些参数?)


另外,我知道在我完成outStream后,我需要刷新和/或关闭它。

您可以逐行读取CSV文件,并在
HttpSerlvetResponse
编写器上写入该行:

公共类下载CsvServlet扩展HttpServlet{
受保护的无效数据集(HttpServletRequest请求,
HttpServletResponse响应)引发ServletException,IOException{
最终文件=新文件(“/tmp/data.csv”);
response.setContentType(“text/csv”);
response.setHeader(“内容处置”,
“附件;文件名=“+file.getName());
final BufferedReader br=新BufferedReader(新文件读取器(文件));
试一试{
弦线;
而((line=br.readLine())!=null){
response.getWriter().write(行+“\n”);
}
}最后{
br.close();
}
}
}
如果同时使用
读卡器
写卡器
,将处理字符编码(CSV文件是编码类似UTF-8的文本文件)

这个解决方案是流式处理的,因此内存中可能只有大文件的一小部分