Servlet下载文件迅雷不支持问题真相之一

问题描述

最近在做一个下载文件的Servlet,直接使用浏览器的下载功能,完美支持,结果测试人员使用迅雷下载,就不行了,下载也能成功完成,只是迅雷下载的文件大小是悲催的0KB

真相搜罗

网上有很多帖子说Servlet怎么支持迅雷下载的,需要设置response参数,比如这个
http://buerkai.iteye.com/blog/1756929

也有讨论迅雷断点续传协议的,比如这个
http://zhidao.baidu.com/link?url=KbZQdoNg3W7iWS5PQ8KqSY0PeVzzkPijD58FPXWYhWzJtf534_FzHd1ChNBtqA2mQjGKC8K9YneVu3iut7Bv30K6G-6WlY3H8wG_59CxMTO

类似的帖子有很多,可是搜来搜去,改来改去,我的Servlet下载文件就是不能支持迅雷

问题分析

经过多次测试,发现迅雷下载文件,会访问两次Servlet,网上也有说是多次的,我测试很多次都是两次,而浏览器下载文件,只访问一次Servlet,这是一个很大的区别

为了一探究竟,也对比过浏览器下载和迅雷下载的请求信息,发现如果是弹出框下载文件,迅雷的两次请求referer参数会有差异
Servlet获取请求信息参考http://my.oschina.net/hlevel/blog/106622

并且,最最关键的是,我的Servlet下载的文件是动态生成的,下载之后就会删除临时文件,所以迅雷请求多次的时候就悲催了

解决办法

迅雷下载失败的根本原因在于临时文件在Servlet被访问一次之后就删除了,后面的请求都获取不到文件内容

既然如此,解决方法如下:
方法一:下载的临时文件不要立即删除,可以通过定时器定时清理
方法二:想办法找到迅雷下载和浏览器下载请求信息的区别,另寻其他解决办法……

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值