浏览器下载完成事件

我们一直在寻找答案,但尚未找到解决方案。

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

有没有办法在没有用户输入的情况下知道这个? 这些文件相对较小,因此不需要进度条function,但我们需要某种“端钩”,它会在下载完成后报告。 这可能吗?

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

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

您可以从直接连接到浏览器的服务器(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查看器,并在显示时将回调添加回服务器。

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

通常用于下载图像的预加载方法(确保具有事件监听器function )。 如果它将其检测为不受支持的图像,则由浏览器自行下载整个PDF,但值得一试。 这是一个例子。

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

穆赫辛

即使文件很小,如果你使用ServletResponsesetContentLength方法,用户也可以区分错误和良好的下载,他们的浏览器下载管理器会告诉他们什么时候完成。

浏览器本身不处理此问题,但您可以使用谷歌齿轮来处理下载请求(它将在下载完成后触发成功事件)。

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

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

我自己没试过,但是看看这个adobe doc的最后一页似乎是可能的。

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