浏览器下载完成事件
我们一直在寻找答案,但尚未找到解决方案。浏览器下载完成事件
我们有一个web服务器,它允许用户下载从servlet动态生成并提供的文件(pdf)。我们想知道下载何时完成(以及如何:是否成功,是否失败,用户是否取消了?)。
有没有办法知道这个没有用户输入?这些文件相对较小,因此不需要进度条功能,但我们需要某种“挂钩”,以便在下载完成时进行报告。这可能吗?
在浏览器端会有哪些功能可以检测下载结束并通过ajax报告回服务器?
除非遇到网络错误,否则无法知道。唯一的方法是让浏览器向服务器发送第二个事件(使用AJAX)来确认下载已成功完成。
即使文件很小,如果您使用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查看器,并在显示时向服务器添加回调。
浏览器本身不处理这个,但你可以使用谷歌齿轮来处理下载请求(它会在下载完成时触发成功事件)。
如果你能在你的文档中插入图像领域,图像HREF可以指向回您的服务器,以确认用户打开PDF文档。
我自己没有尝试过,但看起来可能是last page of this adobe doc。
如果您使用的是Itext,它不支持图像字段,但是您可以使用带有图像字段的pdf模板来构建文档并添加javascript以将url分配给图像字段。
浏览器如何知道下载是否成功完成?这实际上是我的问题的要点,我将编辑以使其更清晰 – laura 2009-10-06 09:24:03
为什么这个答案被接受?我们仍然不知道如何才能浏览器知道下载完成 – abyx 2009-11-02 19:10:19
劳拉,为什么你已经授予了这个答案? ) – dnim 2013-10-01 12:33:59