问题描述
最近在做一个下载文件的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被访问一次之后就删除了,后面的请求都获取不到文件内容
既然如此,解决方法如下:
方法一:下载的临时文件不要立即删除,可以通过定时器定时清理
方法二:想办法找到迅雷下载和浏览器下载请求信息的区别,另寻其他解决办法……