2014-08-29 116 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