2013-08-07 229 views
2

我試圖在Web應用程序上添加一個按鈕,當點擊該按鈕時,下載一個CSV文件(很小,只有4KB大小)。使用Java在瀏覽器中下載CSV文件

我已經有了製作的按鈕和一個監聽器。該文件也準備好了。 我現在需要做的唯一事情就是創建下載csv文件時點擊按鈕的實際事件。

假設「文件」(這是類型文件的)是我使用的CSV文件的名稱和它的蓄勢待發,這是方法我到目前爲止:

public void downloadCSV(HttpServletRequest _request, HttpServletResponse _response, LogFileDetailCommand cmd) throws Exception { 
    ServletOutputStream outStream = _response.getOutputStream(); 
    _response.setContentType("text/csv"); 
    _response.setHeader("Content-Disposition", "attachment; filename=data.csv"); 
} 

我意識到我錯過了將文件寫入ServletOutputStream的部分,但這是我堅持的部分。我知道類ServletOutputStream擴展了類OutputStream(http://docs.oracle.com/javaee/5/api/javax/servlet/ServletOutputStream.html),因此它繼承了它的「寫」方法,所以在理想的世界中,我只想簡單地說「outStream.write(file);」,但我不能這樣做是因爲這些「寫入」方法只有字節,byte []和int作爲參數,並且無法將文件傳遞給它們。

我應該怎麼做將文件傳入outStream?

(除了注意:我要補充這「_response.setContentLength();」,如果是這樣,什麼參數,我應該把它付諸表決)

附:我知道在完成outStream之後我需要刷新和/或關閉它。

回答

2

可以讀取CSV文件中的行由行,並寫上HttpSerlvetResponseWriter行:如果您同時使用ReaderWriter

public class DownloadCsvServlet extends HttpServlet { 

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    final File file = new File("/tmp/data.csv"); 

    response.setContentType("text/csv"); 

    response.setHeader("Content-Disposition", 
      "attachment; filename=" + file.getName()); 

    final BufferedReader br = new BufferedReader(new FileReader(file)); 
    try { 
     String line; 
     while ((line = br.readLine()) != null) { 
      response.getWriter().write(line + "\n"); 
     } 
    } finally { 
     br.close(); 
    } 
} 

} 

,字符編碼將被處理(CSV文件是帶有像UTF-8編碼的文本文件)。

此解決方案,所以只有一小部分可能是大文件在內存中。

+0

現在它的作品感謝你!非常感謝:D – studentcoder