[英]How to get download csv file using java servlet?
我有示例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響應。
HttpServletResponse#getWriter()
。 Content-Disposition
標頭設置為attachment
以強制Web瀏覽器中的“ 另存為”對話框,最終還有filename
屬性。 有一個(主要?)警告:MSIE瀏覽器不會在“ 另存為”對話框中使用指定的filename
作為實際文件名,而是使用URL的pathinfo的最后一部分。 Content-Type
標頭設置為text/csv
以指示webbrowser它是什么類型的文件,以便在最終用戶選擇Open而不是Save時找到正確的關聯應用程序。 通常,在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
進入服務器日志而不是錯誤的響應。
然后,使用/csv/*
的url-pattern
映射web.xml
的CsvServlet
,並通過http://example.com/context/csv/filename.csv調用它。
也就是說,您可能更喜歡真正的CSV格式化程序/編寫器,它可以很好地將String[][]
或List<List<String>>
寫入OutputStream
或Writer
,從而遵守CSV格式規則。 字段值本身可能包含引號或逗號,然后CSV格式會中斷。
將內容類型設置為application/vnd.ms-excel
和content-disposition response.setHeader("Content-Disposition", "attachment; filename=\\"myfile.csv\\"");
響應頭response.setHeader("Content-Disposition", "attachment; filename=\\"myfile.csv\\"");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.