我有示例 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>>
很好地写入 OutputStream
或 Writer
,特此尊重 CSV 格式化规则。如果字段值本身包含引号或逗号,CSV 格式可能会中断。
另见:
关于java - 如何使用 java servlet 下载 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3168272/