浏览器下载完成事件

问题描述:

我们一直在寻找答案,但尚未找到解决方案。浏览器下载完成事件

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

有没有办法知道这个没有用户输入?这些文件相对较小,因此不需要进度条功能,但我们需要某种“挂钩”,以便在下载完成时进行报告。这可能吗?

在浏览器端会有哪些功能可以检测下载结束并通过ajax报告回服务器?

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

+2

浏览器如何知道下载是否成功完成?这实际上是我的问题的要点,我将编辑以使其更清晰 – laura 2009-10-06 09:24:03

+9

为什么这个答案被接受?我们仍然不知道如何才能浏览器知道下载完成 – abyx 2009-11-02 19:10:19

+0

劳拉,为什么你已经授予了这个答案? ) – dnim 2013-10-01 12:33:59

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

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

有一种预加载的方法(肯定与事件监听器设施)通常用于下载图像。如果浏览器检测到它是不受支持的图像,它将由浏览器下载整个PDF,但它值得一试。 Here就是一个例子。

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

穆赫辛

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

浏览器本身不处理这个,但你可以使用谷歌齿轮来处理下载请求(它会在下载完成时触发成功事件)。

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

如果你能在你的文档中插入图像领域,图像HREF可以指向回您的服务器,以确认用户打开PDF文档。

我自己没有尝试过,但看起来可能是last page of this adobe doc

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