Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaServlets:当用户离开页面时,文件下载中断_Java_Http_Servlets_Download - Fatal编程技术网

JavaServlets:当用户离开页面时,文件下载中断

JavaServlets:当用户离开页面时,文件下载中断,java,http,servlets,download,Java,Http,Servlets,Download,我有一个servlet,允许用户从网页下载(可能很大)zip文件。如果用户单击链接下载zip文件,将在servlet中执行类似于以下内容的代码: response.setContentType("application/zip"); response.setHeader("Content-disposition", "attachment; filename=foo.zip"); response.setHeader("Pragma", ""); response.setHeader("Cach

我有一个servlet,允许用户从网页下载(可能很大)zip文件。如果用户单击链接下载zip文件,将在servlet中执行类似于以下内容的代码:

response.setContentType("application/zip");
response.setHeader("Content-disposition", "attachment; filename=foo.zip");
response.setHeader("Pragma", "");
response.setHeader("Cache-Control", "no-store");

ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
// write entries to the zip file...
...
out.close()
但是,如果用户在下载开始后和下载完成前(在Firefox 3.5.7中)刷新或离开页面,下载将失败。弹出以下错误:

C:\blah\foo.zip.part无法删除 已保存,因为源文件无法保存 不可阅读

请稍后再试,或与服务器联系 管理员

关于如何确保在这种情况下继续下载,有什么想法吗


更新:启动下载的链接是普通链接。有趣的是,IE上的行为有所不同。单击站点上其他位置的链接(从当前加载的屏幕)似乎不会加载(浏览器状态栏显示“等待…”),直到下载完成为止。在地址栏中键入不同的URL或使用快捷方式/收藏夹链接将导航到远离页面的位置,但下载仍按预期进行。只有Firefox似乎显示了我上面描述的确切行为,尽管IE阻塞不是最优的。

事实上,这不应该发生。下载被视为一个单独的请求,一旦被调用,该请求应该在后台独立于父页面运行。你到底是如何启动下载请求的?通过普通链接或(错误地)触发ajaxical请求以运行下载的链接

无论如何,您至少清楚地希望能够恢复下载。在这种情况下,您需要在相应的下载过程中至少发送、和响应头。然后,客户端可以通过发送分别带有文件标识符和指定字节范围的和请求头来请求恢复下载,您可以将其与一起使用来发送剩余字节。您可以在中找到更多信息和servlet示例

这就是理论。在您的特殊情况下,在动态压缩文件时有点麻烦。您需要先将zip写入服务器本地磁盘文件系统的临时文件夹,然后从中进行流式传输,最后在下载成功后删除文件(即
out.close()
未抛出
IOException
)。您可以通过请求参数或pathinfo或会话中的密钥来识别关联的zip文件

更新:根据您的更新:我真的不知道,也从未经历过,但至少我可以告诉您。至少,实现前面描述的恢复功能可能是解决这个特定问题的一个方法,因为Firefox将自动恢复下载,而不必担心不完整的部分


更新2:在阅读了您的更新和浏览器行为后,经过一番思考,看起来在触发实际请求和到达响应头之间有相当大的时间间隔。我不知道如何加载文件的确切细节,但看起来收集ZIP文件需要花费时间(可能是事先从网络文件系统或数据库加载的?),而且只有在收集完所有ZIP文件后才设置/发送响应头。在执行昂贵的任务之前,请尝试设置标题并执行
输出.flush()
。通过这种方式,浏览器将尽快获得标题,并且它将知道它可能期望的内容。

我怀疑这是使用servlet的一种假象-可能是重新分配线程的结果。当然,对于用PHP编写的类似设置,我没有这样的问题(其中每个请求都由一个(有效的)新进程处理)


C.

我同意,如果客户端将浏览器转到另一个页面或刷新,独立下载servlet请求不应该出现问题。我用Java实现了下载servlet,它没有遇到任何这些问题。