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

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

最佳答案

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

  • 您需要将 CSV 写入 HttpServletResponse#getWriter()
  • 您需要将 Content-Disposition header 设置为 attachment 以强制在网络浏览器中进行另存为对话,最终连同 filename 属性。有一个(主要?)警告:MSIE 浏览器不会在另存为 对话框中使用指定的 filename 作为实际文件名,而是使用 URL 路径信息的最后一部分。
  • 您需要将 Content-Type header 设置为 text/csv 以指示网络浏览器它是什么类型的文件,以便在最终用户选择打开而不是保存<时它可以找到正确的关联应用程序/em>。通常,在 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 s 和/或 IOException s 发送到服务器日志中,而不是使响应变形。

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


也就是说,您可能更喜欢真正的 CSV 格式化程序/编写器,它可以将 String[][]List<List<String>> 很好地写入 OutputStreamWriter ,特此尊重 CSV 格式化规则。如果字段值本身包含引号或逗号,CSV 格式可能会中断。

另见:

关于java - 如何使用 java servlet 下载 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3168272/

相关文章:

java - 如何使 Netty 示例正常运行

java - LWUIT:如何使用 HTMLComponent 发布表单

java - Servlet REST API 和线程数据交换

python - 使用 python 脚本中的嵌入式查询将 CSV 文件转储到 MySQL 数据库

java - 如何将 Reader 转换为 InputStream 并将 Writer 转换为 OutputStream?

java clean Directory() 如何使目录路径与操作系统无关

java - Servlet 过滤器坚持认为没有响应文本

java - Servlet 的单元测试

excel - Dropzone 在对话框中仅显示 CSV 和 XLS 文件

python - 如何在 Pandas 中打印 CSV 中的某些行