浏览器下载完成事件

2022-09-03 14:55:03

我们一直在寻找这个问题的答案,但还没有找到解决方案。

我们有一个Web服务器,它允许用户下载文件(pdfs),这些文件是从servlet动态生成和提供的。我们想知道下载何时完成(以及如何:是否成功,是否失败,用户是否取消?)。

有没有办法在没有用户输入的情况下知道这一点?这些文件相对较小,因此不需要进度条功能,但是我们需要某种“end-hook”,以便在下载完成后返回。这可能吗?

[编辑]浏览器端有什么功能可以检测下载结束并通过ajax向服务器报告?


答案 1

您可以从直接连接到浏览器(TCP连接的端点)的服务器中获得一个非常好的主意。当用户取消下载或遇到任何网络问题时,服务器将收到 IO 错误。因此,如果您可以直接运行服务器(无需代理)。你可以做这样的事情,

  try {
      response.setContentType("application/pdf");
      response.setContentLength(bytes.length);
      ServletOutputStream ouputStream = response.getOutputStream();
      ouputStream.write(bytes, 0, bytes.length);
      ouputStream.flush();
      ouputStream.close();
      logger.info("PDF " + fileName + " sent successfully");
  } catch (Exception e) {
      logger.error("PDF " + fileName + " error: " + e.getMessage());
      throw e;
  }

但是,成功下载后,用户可能无法在浏览器中看到PDF的可能性很小。从浏览器确认将是最好的方法。如果PDF直接由浏览器显示,则无法执行此操作。您必须使用某种Javascript PDF查看器,并在显示时添加对服务器的回调。


答案 2

除非您收到网络错误,否则您无法知道。唯一的方法是让浏览器向服务器发送第二个事件(使用 AJAX)以确认下载已成功完成。