lingochamp / FileDownloader

Multitask、MultiThread(MultiConnection)、Breakpoint-resume、High-concurrency、Simple to use、Single/NotSingle-process
Apache License 2.0
11.02k stars 2.2k forks source link

下载完成误报问题 #804

Open 271845221 opened 6 years ago

271845221 commented 6 years ago

正如issues上有不少朋友反应的一样,public void completed(BaseDownloadTask task)方法在很多情况下是否不正确的,并且现在最新的版本还有这个问题。先来表述一下我这边的问题吧: 1、先在可以访问互联网的WiFi环境下,下载一个500M的文件; 2、切换到另一个WiFi,在手机上该WiFi显示的是已连接状态,实际上是不能访问互联网的,需要在路由上某html界面认证后才能访问互联网; 3、再点击继续下载上述那个500M的文件,该文件立即显示现在完成,并且文件大小也变成了几百byte,后来想想,这个几百byte的文件,应该就是路由上某html界面对应的那个html文件的大小。

4、其他在WiFi与手机流量之间切换也会出现类似情况; 5、看了issues,有朋友反应反复地进行开始/暂停操作,也会出现文件未下载完而误报现在完成的情况。

请楼主查看下,发生了什么问题,如何修改?

Jacksgong commented 6 years ago

多谢,我总算明白他们遇到的问题了。该问题应该是:

无论访问什么资源,都会直接将其替换为一个认证的网页(返回的是200,不是302、307或者其他重定向状态码,并且直接替换了response内容,输入流内容),如我测试了一个:

image

然后FileDownloader便下载了这个认证网页了(实际上FileDownloader检测到远端告知的数据大小发生改变等情况,便判定原资源已经在服务端被修改,因此重新开始下载了该资源,便下载了这个网页)。


这个情况,FileDownloader内部还是挺难判定的。通过Content-Type: text/html去判定是不可靠的,甚至本来上层就是要下载一个html,估计要从判定网络是否真的能通入手。这个问题需要探究探究。。

ApacheJondy commented 6 years ago

+1 这个问题确实恼火~

AzureFatty commented 6 years ago

+1 同样遇到了。下载了一个HTML。

longzekai commented 6 years ago

mark,关注下。

mr-yang commented 6 years ago

我月遇到这个问题了