java下载被中断,Java Servlets:当用户离开页面时,文件下载中断

我有一个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 could not be

saved, because the source file could

not be read.

Try again later, or contact the server

administrator.

关于如何确保在这种情况下继续下载的任何想法?

更新:启动下载的链接是一个简单的vanilla链接.有趣的是,IE上的行为是不同的.似乎没有加载网站上其他位置的链接(从当前加载的屏幕)(浏览器状态栏显示“正在等待https://mysite/clicked_linky.do …”),阻塞直到下载完成.在地址栏中键入不同的URL或使用快捷方式/收藏夹链接导航离开页面,但下载按预期继续.只有Firefox似乎显示我上面描述的确切行为,尽管IE阻止不是最佳的.

解决方法:

事实上这应该不会发生.下载计为一个单独的请求,应该在调用时独立于父页面在后台运行.你究竟是如何解雇下载请求的?通过简单的vanilla链接或链接(错误地)触发ajaxical请求来运行下载?

无论如何,您至少显然希望能够恢复下载.在这种情况下,您需要相应地在下载中至少发送Accept-Ranges,ETag和Last-Modified响应标头.然后,客户端可以通过发送分别具有文件标识符和指定字节范围的If-Range和Range请求标头来请求恢复下载,您可以将其与RandomAccessFile结合使用以发送剩余字节.您可以在this article找到更多信息和servlet示例.

这就是理论.在您的特定情况下,当您正在快速压缩文件时,它会有点琐碎.您需要先将zip写入服务器本地磁盘文件系统的临时文件夹,然后从中流式传输,最后只有在下载成功完成后才删除该文件(即out.close()没有抛出IOException ).您可以通过请求参数或pathinfo或会话中的密钥来识别关联的zip文件.

更新:根据您的更新:我真的不知道,我从来没有经历过它,但至少我可以告诉you’re not the only one who suffered from this problem.至少,如前所述实现恢复功能可能是Firefox的特定问题的解决方案然后会自动恢复下载,而不会产生不完整的部分.

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

标签:java,http,servlets,download

来源: https://codeday.me/bug/20190518/1130738.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值