有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java浏览器通过文件下载冻结

我在下载文件时遇到问题,在下载过程完成后,单击任何链接、按钮和菜单时,我无法获得任何操作或事件

下面是我的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");
        }
    });

下面是处理excel文件下载请求的servlet(我用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();
}
}

卓越支持。下面是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 : I am sure this codes work fine and did not freeze on other GWT projects.


共 (1) 个答案

  1. # 1 楼答案

    现在我发现了问题所在。我使用了Network console of Firefox 31here是下载前的屏幕截图here是下载后的屏幕截图。我注意到我丢失了所有的web数据,因为url被getUI().getPage().open(url.toString(), "_self");替换了

    所以,如果我使用其他浏览器而不是_self,一切都很好,但浏览器是块弹出窗口。我不能告诉用户启用浏览器的弹出窗口。最后,我使用链接组件,如下所示

        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);