如何使用java servlet下载csv文件?

时间:2010-07-02 18:36:18

标签: java servlets csv

我有示例java servlet文件。但它导出到本地文件。但是我需要在点击下载按钮时下载csv文件吗?

这里是servlet类,我需要在这里添加什么代码才能下载csv文件?

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CsvFile extends HttpServlet { 
public void doGet (HttpServletRequest request,HttpServletResponse response) 
throws ServletException,IOException  {
try
{
      PrintWriter out = response.getWriter();
      String filename = "c:\\csv\\myfile.csv";
      FileWriter fw = new FileWriter(filename);

      fw.append("Employee Code");
      fw.append(',');
      fw.append("Employee Name");
      fw.append(',');
      fw.append("Employee Address");
      fw.append(',');
      fw.append("Employee Phone");
      fw.append(',');
      fw.append("Employee ZipCode");
      fw.append('\n');

      fw.append("E1");
      fw.append(',');
      fw.append("Vineet");
      fw.append(',');
      fw.append("Delhi");
      fw.append(',');
      fw.append("224277488");
      fw.append(',');
      fw.append("110085");
      fw.append('\n');

      fw.append("E2");
      fw.append(',');
      fw.append("Amar");
      fw.append(',');
      fw.append("Delhi");
      fw.append(',');
      fw.append("257765758");
      fw.append(',');
      fw.append("110001");
      fw.append('\n');

      fw.append("E3");
      fw.append(',');
      fw.append("Amit");
      fw.append(',');
      fw.append("Delhi");
      fw.append(',');
      fw.append("257685858");
      fw.append(',');
      fw.append("110005");
      fw.append('\n');

      fw.append("E4");
      fw.append(',');
      fw.append("Suman");
      fw.append(',');
      fw.append("Delhi");
      fw.append(',');
      fw.append("266447678");
      fw.append(',');
      fw.append("110081");
      fw.append('\n');


      fw.flush();
      fw.close();
      out.println("<b>Csv file Successfully created.</b>");

} 
catch (Exception ex) {
ex.printStackTrace ();
}
}
}

2 个答案:

答案 0 :(得分:4)

您正在写入文件而不是HTTP响应。

  • 您需要将CSV写入HttpServletResponse#getWriter()
  • 您需要将Content-Disposition标题设置为attachment,以强制在网络浏览器中使用另存为对话框,最后还有filename属性。有一个(主要?)警告:MSIE浏览器不会在另存为对话框中使用指定的filename作为实际文件名,而是使用路径信息的最后一部分网址。
  • 您需要将Content-Type标头设置为text/csv,以指示Web浏览器它是什么类型的文件,以便在最终用户选择打开而不是保存。通常,在Windows机器上,MS Excel默认与该内容类型相关联。

要实现这些要求,您需要创建一个CsvServlet,它基本上在doGet()方法中执行以下操作。

String filename = request.getPathInfo().substring(1); // get rid of leading `/`
response.setHeader("Content-Type", "text/csv");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
PrintWriter writer = response.getWriter();
writer.append("CSV content");
// ...

这就是全部。 flush()close()顺便说一下并不是绝对必要的,但如果您想避免请求链中的其他内容正在向响应主体附加内容(这应该严格不是会发生,但它只会将IllegalStateException和/或IOException发送到服务器日志中,而不会使响应失真。

然后,将CsvServlet中的web.xml映射为url-pattern /csv/*,并http://example.com/context/csv/filename.csv调用它。


那就是说,你可能更像是一个真正的CSV格式化程序/编写器,可以很好地将String[][]List<List<String>>写入OutputStreamWriter,特此尊重CSV格式规则。字段值本身可能包含引号或逗号,然后CSV格式会中断。

另见:

答案 1 :(得分:3)

将内容类型设置为application/vnd.ms-excel,并为内容处置设置响应标头 response.setHeader("Content-Disposition", "attachment; filename=\"myfile.csv\"");