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

Nan*_*ncy 4 java csv servlets

我有示例 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 ();
}
}
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

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

  • 您需要将 CSV 写入HttpServletResponse#getWriter().
  • 您需要将Content-Dispositionheader设置为在 webbrowser 中attachment强制另存为对话框,最终与一个filename属性一起。有一个(主要?)警告:MSIE 浏览器不会filename在“另存为”对话框中使用指定的实际文件名,而是使用 URL 路径信息的最后一部分。
  • 您需要将Content-Typeheader 设置text/csv为指示 webbrowser 它是什么类型的文件,以便当最终用户选择Open而不是Save时它可以找到正确的关联应用程序。通常,在 Windows 机器上,默认情况下 MS Excel 与该内容类型相关联。

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

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");
// ...
Run Code Online (Sandbox Code Playgroud)

就这样。顺便说一下,flush()andclose()并不是绝对必要的,但如果您想避免请求链中的其他内容将某些内容附加到响应正文中(这绝对应该发生,但它只会发出IllegalStateExceptions 和/或IOExceptions 到服务器记录而不是使响应格式错误。

然后,使用of映射CsvServletin并通过http://example.com/context/csv/filename.csv调用它。web.xmlurl-pattern/csv/*


也就是说,您可能更喜欢真正的 CSV 格式化程序/编写器,它可以很好地将 aString[][]或 a写入List<List<String>>OutputStreamor Writer,从而遵守 CSV 格式规则。可能会发生字段值本身包含引号或逗号的情况,然后 CSV 格式会中断。

也可以看看: