2016-07-28 47 views
0

我試圖在我的網頁中實現一個鏈接,將文件下載爲CSV文件。該文件的內容被附加到stringbuffer並刷新到響應自身。下面的代碼是什麼,我試圖做到這一點:Java下載鏈接,Spring MVC

public void getDownloadFile(HttpServletResponse response) throws IOException{ 
     response.setContentType("application/octet-stream"); 
      response.setHeader("Content-Disposition","attachment;filename=data.csv"); 
      ServletOutputStream out = response.getOutputStream(); 
      try{ 
      StringBuffer sb = generateCsvFileBuffer();   
      InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); 
      byte[] outputByte = new byte[4096]; 

      while(in.read(outputByte, 0, 4096) != -1) 
      { 
       out.write(outputByte, 0, 4096); 
      } 
      in.close(); 
      out.flush(); 
      out.close();    
      } 
     catch (Exception e) { 
      System.out.println("Error in CsvFileWriter !!!"); 
      e.printStackTrace(); 
     } finally { 
      try { 
       out.flush(); 
       out.close(); 
      } catch (IOException e) { 
       System.out.println("Error while flushing/closing fileWriter !!!"); 
       e.printStackTrace(); 
      } 
     } 
      return; 
    } 

並稱爲generateCsvFileBuffer()方法就是該文件的詳細信息被寫入。方法如下:

public StringBuffer generateCsvFileBuffer(){ 
     StringBuffer writer = new StringBuffer(); 

     writer.append("name"); 
     writer.append(", "); 
     writer.append("age"); 
     writer.append(", "); 
     writer.append("address"); 
     writer.append(", "); 
     writer.append("phone no"); 
     writer.append("\n"); 

     return writer; 
    } 

程序運行到最後一行代碼沒有任何錯誤但沒有輸出。點擊鏈接時,視圖中沒有任何反應。任何幫助,高度讚賞。

回答

0

爲了更好的錯誤處理和可讀性,我冒昧地用Java 7的try-with-resources重寫代碼。

package demo.spring.mvc; 

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
public class FileDownloadController { 

    @RequestMapping("/download") 
    public void download(Model model, HttpServletResponse resp) { 
     resp.setContentType("text/csv"); 
     resp.setHeader("Content-Disposition", "attachment;filename=data.csv"); 
     String csv = generateCsv(); 
     try (ServletOutputStream out = resp.getOutputStream();) { 
      byte[] arr = new byte[4096]; 
      try (InputStream in = new ByteArrayInputStream(csv.getBytes("UTF-8"));) { 
       for (int c; (c = in.read(arr)) != -1;) { 
        out.write(arr, 0, c); 
       } 
      } 
     } catch (IOException e) { 
      System.err.println("Error in CsvFileWriter!!!"); 
      e.printStackTrace(); 
     } 
    } 

    public String generateCsv() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("name") 
       .append(", ").append("age") 
       .append(", ").append("address") 
       .append(", ").append("phone no") 
       .append("\n"); 
     return sb.toString(); 
    } 

} 

作爲額外的好處,這裏有一些關於原始代碼的想法。

  • 我將StringBuffer更改爲StringBuilder。自Java 5以來,您可以通過將您的StringBuffer切換到其未同步的對方StringBuilder以獲得更好的性能。
  • 您的while循環出錯了,因爲您沒有測試讀取的字符數(我介紹的int爲c)。
  • 您可以將呼叫鏈接到append(...)以避免重複應用該方法的變量名稱。
  • 我從呼叫切換到System.out到撥打System.err,因爲這裏主要是錯誤處理。這遠非完美。使用日誌記錄系統會更好。
+0

Thanku的幫助,但它仍然只顯示了覆蓋鏈接被點擊時,我甲肝在JS給出。還有什麼我可以做的解決這個問題。 –

+0

那麼你的問題肯定不是Java代碼,而是配置。你可以發佈web.xml或WebApplicationInitializer和Spring配置嗎? –