2017-04-15 60 views
0

我試圖圍繞Java輸出/輸入流,關閉和刷新我的頭。我有一種情況,我想使用來自服務器的數據使用Apache POI創建文件。我希望文件一旦從數據庫中檢索到第一條記錄就開始下載(顯示瀏覽器底部的文件已經開始下載)。Java輸出流,觸發文件下載從數據庫檢索所有數據之前下載

public void createExcelFile(final HttpServletResponse response, 
    final Long vendorId) { 
    try { 
     // setup responses types... 

     final XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); 
     final XSSFSheet sheet = xssfWorkbook.createSheet("sheets1"); 

     // create file with data 
     writeExcelOutputData(sheet, xssfWorkbook); 

     xssfWorkbook.write(response.getOutputStream()); 
     xssfWorkbook.close(); 
    } 
    catch (final Exception e) { 
     LOGGER.error("Boom"); 
    } 

上面的代碼將執行文件下載沒有問題,但是這可能是一個很大的文件。我走下車獲得(約20/30秒)的數據,然後後,開始下載<沒有好...

我可以achive什麼,我需要什麼或者最好的方法,在此先感謝

乾杯: )

+0

您正在嘗試傳輸一個Excel文件?除非它是一個流,否則在它完成之前不能發送它。 –

+0

如果你在一個流中創建它,你將無法下載它。客戶端瀏覽器將不得不用一些插件來解釋它。 –

+0

我會批量返回數據......因此觸發文件在所有批次恢復之前開始下載是不可能的? – rogger2016

回答

2

原因可能如下:

  1. 也許有一個與你的HTTP服務器的讀/寫超時,那麼如果這個過程變得冗長或becasue低帶寬的,所以連接將被關閉由服務器。

  2. 確保過程(excel工作)完全完成,也許在工作中會出現錯誤/異常。

豪爾赫的解決方案看起來非常有前途。用戶需要一次請求一個文件,然後服務器會在後臺完成工作,然後用戶檢查工作進程並準備下載文件,或者服務器通過電子郵件,網絡通知等通知用戶...

也可以將文件保存在臨時文件中一段時間​​,如果連接中斷,服務器將響應生成的文件部分(省略發送的字節,如正常文件下載)

保持連接處於活動狀態做冗長的工作不是很合乎邏輯。

同樣,如果文件準備快速(非常快)下載/流,下載中斷,如果可能由於服務器讀取/寫入超時或非常糟糕的網絡。