2017-04-15 21 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工作)完全完成,也许在工作中会出现错误/异常。

豪尔赫的解决方案看起来非常有前途。用户需要一次请求一个文件,然后服务器会在后台完成工作,然后用户检查工作进程并准备下载文件,或者服务器通过电子邮件,网络通知等通知用户...

也可以将文件保存在临时文件中一段时间​​,如果连接中断,服务器将响应生成的文件部分(省略发送的字节,如正常文件下载)

保持连接处于活动状态做冗长的工作不是很合乎逻辑。

同样,如果文件准备快速(非常快)下载/流,下载中断,如果可能由于服务器读取/写入超时或非常糟糕的网络。