2014-08-29 115 views
0

下載文件時出現問題,下載過程完成後點擊任何鏈接,按鈕和菜單時,我無法獲取任何操作或事件。通過文件下載凍結瀏覽器

下面是我爲Excel文件下載按鈕代碼...

Button btnDownloadExcel = new Button("Excel Download"); 
    btnDownloadExcel.addStyleName("downloadButton"); 
    btnDownloadExcel.addClickListener(new ClickListener() { 

     @Override 
     public void buttonClick(final ClickEvent event) { 
      StringBuilder url = new StringBuilder("/myproject/filedownload.html?category=excel"); 
      url.append("&seq=" + 111); 
      getUI().getPage().open(url.toString(), "_self"); 
     } 
    }); 

下面的servlet的手柄excel文件下載請求(我用JExcel API爲excel文件

@WebServlet(value = "/filedownload.html") 
public class DownloadServletController extends HttpServlet { 
private final Logger log = LoggerFactory.getLogger(DownloadServletController.class); 

protected final void doGet(final HttpServletRequest request, 
     final HttpServletResponse response) throws ServletException, IOException { 
    String category = request.getParameter("category"); 
    long seq = request.getParameter("seq") == null ? -1L : Long.parseLong(request.getParameter("seq")); 
    byte[] stream = null; 
    if (category.equals("excel")) { 
     try { 
      stream = getSampleExcelStream(seq); 
     } 
     catch (BusinessException e) { 
      log.error("Generating streams for " + category + " got Error !" + e); 
     } 
     ExcelSupport.createExcel("Test", seq, stream, response); 
    } 
} 

private byte[] getSampleExcelStream(final long seq) throws BusinessException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     String staticDir = System.getProperty("staticDir"); 
     String templateDir = staticDir + "/templates/sample_excel_template.xls"; 

     WorkbookSettings wsWrite = new WorkbookSettings(); 
     wsWrite.setEncoding("UTF-8"); 
     wsWrite.setAutoFilterDisabled(false); 
     WritableWorkbook workBook = Workbook.createWorkbook(baos, Workbook.getWorkbook(new File(templateDir)), 
       wsWrite); 

     workBook.write(); 
     baos.close(); 
     workBook.close(); 
    } 
    catch (BiffException e) { 
     throw new BusinessException("Excel file Creating Error!"); 
    } 
    catch (WriteException e) { 
     throw new BusinessException("Error ! writing excel file process has occured!"); 
    } 
    catch (FileNotFoundException e) { 
     throw new BusinessException("FileNotFoundException, when getting stream for excel", e); 
    } 
    catch (IOException e) { 
     throw new BusinessException("IOException, when getting stream for excel", e); 
    } 
    return baos.toByteArray(); 
} 
} 

ExcelSupport.java低於

public final class ExcelSupport { 
private ExcelSupport() { 
} 

private static final Logger LOGGER = LoggerFactory.getLogger(ExcelSupport.class); 

public static void createExcel(final String fileNamePrefix, final long seq, 
     final byte[] stream, final HttpServletResponse response) { 
    StringBuffer fileName = new StringBuffer(); 
    fileName.append(fileNamePrefix + "_"); 
    if (seq > -1) { 
     fileName.append("(uid-" + seq + ")_"); 
    } 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 
    fileName.append(sdf.format(new Date())); 
    fileName.append(".xls"); 

    StringBuffer sbContentDispValue = new StringBuffer(); 
    sbContentDispValue.append("inline"); 
    sbContentDispValue.append("; filename="); 
    sbContentDispValue.append(fileName); 

    response.setContentType("application/msexcel"); 
    response.addHeader("Cache-Control", "max-age=30"); 
    response.addHeader("Content-disposition", sbContentDispValue.toString()); 
    response.setContentLength(stream.length); 
    try { 
     ServletOutputStream osStream = response.getOutputStream(); 
     osStream.write(stream); 
     osStream.flush(); 
     osStream.close(); 
    } 
    catch (IOException e) { 
     LOGGER.error("Creating Excel for " + fileName + " got Error !" + e); 
    } 
} 
} 

有人可以糾正我的錯誤嗎?下載過程很好,沒有錯誤,我成功地獲得了excel文件。但我不知道爲什麼瀏覽器被凍結。在IDE控制檯和瀏覽器控制檯中看不到任何錯誤日誌或消息。感謝您閱讀我的問題!

PS:我相信這段代碼工作正常,並沒有凍結其他GWT項目。

+0

哪個瀏覽器會凍結?也許嘗試與其他瀏覽器只是爲了確保這是一個服務器問題 – 2014-08-29 06:13:31

+0

@AndréSchild我在第26頁,第31頁,鉻,Safari瀏覽器中測試過。他們是一樣的,我想這是由於Vaadin,但我不確定。 – Cataclysm 2014-08-29 07:20:33

+0

「凍結」是什麼意思?你必須強行殺死網頁瀏覽器嗎?它在哪一點凍結?例如,您可以查看FF控制檯中的網絡流量。 (請求到服務器,請求服務器等回答) – 2014-08-29 09:49:53

回答

0

現在我發現了這個問題。我使用Network console of Firefox 31here是下載前的屏幕拍攝,下載後是here。我注意到我丟失了所有的網頁數據,因爲替換網址是getUI().getPage().open(url.toString(), "_self");

所以,如果我使用其他人而不是_self,一切都很好,但瀏覽器是塊彈出窗口。我無法告訴用戶啓用瀏覽器的彈出窗口。所以,最後我使用Link組件如下。

Link linkDownloadExcel = new Link("Excel Download", new ExternalResource(
     "/myproject/filedownload.html?category=excel&seq=" + 111), "_blank", -1, -1, BorderStyle.DEFAULT); 
    linkDownloadExcel.addStyleName("downloadButton"); 
    linkDownloadExcel.setIcon(new ExternalResource("/myproject/images/excel-icon.png")); 
    hlButtonLayout.addComponent(linkDownloadExcel); 
+1

是不鼓勵的,更新的vaadin版本甚至不推薦使用這個api的一部分來防止用戶在腳下自己拍攝。 https://vaadin.com/book/-/page/advanced.printing.html#advanced.printing.pdf就是一個例子,如何處理下載情況下,不能直接鏈接。 – cfrick 2014-08-29 13:44:56