【问题标题】:Browser download complete event浏览器下载完成事件
【发布时间】:2009-10-06 09:16:51
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java file download web-applications


    【解决方案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 的可能性仍然很小。来自浏览器的 ACK 将是最好的方法。如果 PDF 由浏览器直接显示,则不能这样做。您必须使用某种 Javascript PDF 查看器并在显示时添加对服务器的回调。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 浏览器如何知道下载是否成功?实际上,这就是我的问题的要点,我将对其进行编辑以使其更清晰
      • 为什么这个答案被接受了?我们还是不知道浏览器怎么知道下载完成了
      • 劳拉,你为什么得到这个答案? )
      【解决方案3】:

      有时可以在 servlet 中检测到用户取消。以 Tomcat 为例,尝试将大文件流式传输到客户端,然后取消下载。您可以在 logs/catalona.out 中看到异常的堆栈跟踪。但是,我不确定这是否可以在 servlet 本身或较低级别(在 catalina 内部)中处理。

      通常用于下载图像的预加载方法(确保使用事件侦听器facility)。如果它检测到它是不受支持的图像,则取决于浏览器是否下载整个 PDF,但值得一试。 Here 就是一个例子。

      另一种解决方案是使用<object><embed> 标签隐式下载PDF,并使用它们的onload 事件监听器。并不是说这仅在浏览器中完成 ActiveX 或某种 PDF 文件关联时才有效,如果用户没有 PDF 查看器,则可能不起作用。 Here 是一个示例(参见辅助解决方案:11/21/04 08:22 AM,ID:12638846)。

      莫森

      【讨论】:

        【解决方案4】:

        即使文件很小,如果您使用ServletResponsesetContentLength 方法,用户将能够区分错误和良好下载,并且他们的浏览器下载管理器会在下载完成时告诉他们。

        【讨论】:

          【解决方案5】:

          浏览器本身不处理此问题,但您可以使用 google gears 处理下载请求(下载完成后会触发成功事件)。

          http://code.google.com/apis/gears/api_httprequest.html

          【讨论】:

            【解决方案6】:

            如果您可以在文档中插入图像字段,则图像 href 可以指向您的服务器以确认用户已打开 pdf 文档。

            我自己没有尝试过,但看看last page of this adobe doc 似乎是可能的。

            如果您使用的是 Itext,它不支持图像字段,但您可以使用带有图像字段的 pdf 模板来构建文档并添加 javascript 以将 url 分配给图像字段。

            【讨论】:

              猜你喜欢
              • 2012-12-12
              • 1970-01-01
              • 2014-02-08
              • 2023-03-26
              • 1970-01-01
              • 1970-01-01
              • 2022-01-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多