簡體   English   中英

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

[英]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響應。

  • 您需要將CSV寫入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.xmlCsvServlet ,並通過http://example.com/context/csv/filename.csv調用它。


也就是說,您可能更喜歡真正的CSV格式化程序/編寫器,它可以很好地將String[][]List<List<String>>寫入OutputStreamWriter ,從而遵守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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM