我正在尝试在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之后我需要刷新和/或关闭它。
答案 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的文本文件)。
此解决方案流,因此只有一小部分可能很大的文件存在于内存中。