Java outputstream,在从数据库检索到所有数据之前触发文件下载

Java outputstream, trigger file download before all data retrieved from db

我正在努力思考 Java Out/Inputstreams,关闭并冲洗。我有一种情况,我想使用来自服务器的数据使用 Apache POI 创建一个文件。我希望文件在我从数据库中检索到第一条记录后立即开始下载(在浏览器底部显示文件已开始下载)。

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 秒),然后开始下载 < 不好...

我能达到我的需要吗?最好的方法是什么,提前致谢

干杯:)

原因可能如下:

  1. 可能是你的http服务器read/write超时,然后如果进程变长或者因为低带宽,那么连接将被服务器关闭。

  2. 确保过程(excel工作)完全完成,也许工作期间会有error/exception。

Jorge 的解决方案看起来很有前途。用户需要一次请求文件,然后服务器将在后台完成工作,然后用户检查工作进程并下载文件是否准备好,或者服务器通过电子邮件、网络通知等方式通知用户...

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

保持连接活动以进行冗长的工作是不合逻辑的。

同样,如果 download/stream 文件快速(非常快)就绪,并且下载中断,可能是因为 read/write 服务器超时,或者网络非常糟糕。