lingochamp / FileDownloader

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

文件大小为0b无法成功下载 #1064

Open kolacbb opened 6 years ago

kolacbb commented 6 years ago

VERSION 1.7.4

ERROR LOG there isn't any content need to download on -1705443798--1 with the content-length is 0

可能是个功能,但是chrome能够成功下载0B大小的文件,这个直接报错

xuanu commented 6 years ago

同样问题

rantianhua commented 6 years ago

这里我有个问题想确认下:

请问有没有在 filedownload.properties 里面设置 download.trial-connection-head-method=true ?


还希望你提供:

  1. 你的下载链接(如果可以的话)。
  2. 如果下载运行在 filedownloader 进程,请提供下该进程的日志,否则请提供下主进程所有下载相关的日志。
xuanu commented 6 years ago

http://cdn.qimonjy.cn//classroom/1.txt http://cdn.qimonjy.cn:80/classroom/1.txt http://upload.qimonjy.cn:7777/classroom/1.txt

rantianhua commented 6 years ago

根本原因

看了下本质原因其实是服务器的问题。FileDownloader 在正式下载前,会发起一个 range 为 0-0 的 GET 请求,目的是通过 Content-Range 获取文件大小,但是你给出的链接里,返回的 response 为:

Accept-Ranges=[bytes], Age=[800], Connection=[keep-alive], Content-Length=[0], Content-Type=[text/plain], Date=[Thu, 12 Jul 2018 10:50:27 GMT], EagleId=[deba319e15313934275383308e], ETag=["5b3ddf42-0"], Last-Modified=[Thu, 05 Jul 2018 09:05:06 GMT], Server=[Tengine], Timing-Allow-Origin=[*], Via=[cache45.l2et15-2[0,200-0,H], cache12.l2et15-2[1,0], kunlun8.cn74[43,200-0,M], kunlun5.cn74[80,0]], X-Android-Received-Millis=[1531393426808], X-Android-Response-Source=
[NETWORK 200], X-Android-Sent-Millis=[1531393426713], X-Cache=[MISS TCP_MISS dirn:-2:-2 mlen:-1], X-Swift-CacheTime=[3600], X-Swift-SaveTime=[Thu, 12 Jul 2018 11:03:47 GMT]}

即 response 里面没有返回 Content-Range ,获取不到文件大小,所以 FileDownloader 就当做 chunked 的方式下载,此时下载发现没有内容,才抛出了你看到的错误。


为什么不通过 Content-Length 获取文件大小?

response 里面有 Content-Length ,但是此时这个值是无效的,因为 rang 为 0-0 。


解决办法

  1. 最本质的问题在于服务端没有严格按照协议实现,所以本质上需要服务端解决。
  2. 我们也会商量下是否会在 1.7.5 版本里针对这个 case 做下兼容处理。