如何恢复中断的下载 - 第2部分 [英] how to resume an interrupted download - part 2

查看:106
本文介绍了如何恢复中断的下载 - 第2部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个延续的<一个href="http://stackoverflow.com/questions/3411480/how-to-resume-an-interrupted-download/3411558#3411558">my previous问题我贴的时候我是不是注册用户。作为一个回顾,我想从我的雅虎网站服务器恢复大文件的下载时,下载被中断。我previously认为中断是由于100秒的超时限制(因为雅虎强制对用户编写脚本的时间限制)。然而,当我测下载中断的时间,我看到的中断时间变化较大(有时下载运行不间断小于100秒,有时长达七分钟)。因此,我不知道超时的原因,我只是试图解决它们。

我想建议通过 naikus (谢谢),并根据HTTP报头字段的转储,它出现我的雅虎的网站服务器会识别范围属性,应该允许下载时恢复中断的偏移量。不幸的是,虽然该字节范围出现在恢复连接的http头正确,所传送的内容总是重新开始该文件的开头。 (我的测试文件是50000的4字节整数递增从0开始。我下载的文件总是从0开始讲述每偏移下载中断发生的时间。)

有一些其他的HTTP连接属性要求我应该做,以获得雅虎的服务器实际跳到文件抵消了头的字节范围规定?这里的code和什么它转储:

  //设置连接。
         网址URL =新的URL(strUrl [0]);
         URLConnection的连接= url.openConnection();
         下载的Integer.parseInt =(strUrl [3]);
         如果(下载的大于0){
             connection.setRequestProperty(范围,字节=+下载+ - );
             connection.connect();
             文件长度= mDownloadFileLength;
             Log.d(AsyncDownloadFile
                 新的下载求:+下载+
                 ; lengthFile:+文件长度);
         }
         其他 {
             connection.connect();
             下载= 0;
             文件长度= connection.getContentLength();
             mDownloadFileLength =文件长度;
         }
         地图&LT;字符串列表与LT;字符串&GT;&GT;地图= connection.getHeaderFields();
         Log.d(AsyncDownloadFile,头字段:+ map.toString());

         //设置流和缓冲器。
         输入=新的BufferedInputStream(url.openStream(),8192);
         不过outFile =新的RandomAccessFile(strUrl [1],RW);
         如果(下载的大于0)
             outFile.seek(下载);
         字节的数据[] =新的字节[1024];

         // 下载文件。
         对于(诠释计数= 0,I = 0;(计数= input.read(数据,0,1024))= -1;!我++){
             outFile.write(数据,0,计数);
             下载+ =计数;
             如果(下载&GT; =文件长度)
                 打破;

             //显示进度。
             Log.d(AsyncDownloadFile,字节:+下载);
             如果((我%10)== 0)
                 publishProgress((int)的(下载的* 100 /文件长度));
             如果(mFlagDisableAsyncTask){
                 下载= 0;
                 打破;
             }
         }

         //关闭流。
         outFile.close();
         input.close();
 


转储:

  @ 4时08分24秒
D / AsyncDownloadFile(2372):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [2000000],年龄= [0],服务
R = [YTS / 13年1月17日],接受-范围= [字节],日期= [星期五,2010年8月6日二十点08分33秒GMT]}
D / AsyncDownloadFile(2372):字节:1024
D / AsyncDownloadFile(2372):字节1033
D / AsyncDownloadFile(2372):字节:2057
D / AsyncDownloadFile(2372):字节:2493
D / AsyncDownloadFile(2372):字节:3517
D / AsyncDownloadFile(2372):字节:3953

。
。
。

@ 4点13分25秒
D / AsyncDownloadFile(2372):字节:386473
D / AsyncDownloadFile(2372):字节:387497
D / AsyncDownloadFile(2372):字节:387933
D / AsyncDownloadFile(2372):新的下载求:387933; lengthFile:2000000
D / AsyncDownloadFile(2372):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [1612067],年龄= [0],服务
R = [YTS / 13年1月17日],接受-范围= [字节],日期= [星期五,2010年8月6日20点13分29秒格林尼治标准​​时间],合
ntent范围= [字节387933-1999999 / 2000000]}
D / AsyncDownloadFile(2372):字节:388957
D / AsyncDownloadFile(2372):字节:389981
D / AsyncDownloadFile(2372):字节:390409
D / AsyncDownloadFile(2372):字节:391433
D / AsyncDownloadFile(2372):字节:391869
D / AsyncDownloadFile(2372):字节:392893

。
。
。

@四时18分45秒
D / AsyncDownloadFile(2372):字节:775413
D / AsyncDownloadFile(2372):字节:775849
D / AsyncDownloadFile(2372):字节:776873
D / AsyncDownloadFile(2372):字节:777309
D / AsyncDownloadFile(2372):新的下载求:777309; lengthFile:2000000
D / AsyncDownloadFile(2372):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [1222691],年龄= [0],服务
R = [YTS / 13年1月17日],接受-范围= [字节],日期= [星期五,2010年8月6日20时18分54秒格林尼治标准​​时间],合
ntent范围= [字节777309-1999999 / 2000000]}
D / dalvikvm(2372):GC_FOR_MALLOC释放11019对象/ 470560字节155ms
D / AsyncDownloadFile(2372):字节:778333
D / AsyncDownloadFile(2372):字节:779357
D / AsyncDownloadFile(2372):字节:779790
D / AsyncDownloadFile(2372):字节:780814
D / AsyncDownloadFile(2372):字节:781250
D / AsyncDownloadFile(2372):字节:782274

。
。
。

@ 4时23分45秒
D / AsyncDownloadFile(2372):字节:1163334
D / AsyncDownloadFile(2372):字节:1163770
D / AsyncDownloadFile(2372):字节:1164794
D / AsyncDownloadFile(2372):字节:1165​​230
D / AsyncDownloadFile(2372):新的下载求:1165​​230; lengthFile:2000000
D / AsyncDownloadFile(2372):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [834770],年龄= [0],服务器
= [YTS / 13年1月17日],接受-范围= [字节],日期= [星期五,2010年8月6日20时23分47秒格林尼治标准​​时间],CON
帐篷范围= [字节1165230-1999999 / 2000000]}
D / AsyncDownloadFile(2372):字节:1166246
D / AsyncDownloadFile(2372):字节:1167270
D / AsyncDownloadFile(2372):字节:1167706
D / AsyncDownloadFile(2372):字节:1168730
D / AsyncDownloadFile(2372):字节:1169754
D / AsyncDownloadFile(2372):字节:1170778

。
。
。

@四时三十分25秒
D / AsyncDownloadFile(2372):字节:1551255
D / AsyncDownloadFile(2372):字节:1551691
D / AsyncDownloadFile(2372):字节:1552715
D / AsyncDownloadFile(2372):字节:1553151
D / AsyncDownloadFile(2372):新的下载求:1553151; lengthFile:2000000
D / AsyncDownloadFile(2372):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [446849],年龄= [0],服务器
= [YTS / 13年1月17日],接受-范围= [字节],日期= [星期五,2010年8月6日20时三十分44秒格林尼治标准​​时间],CON
帐篷范围= [字节1553151-1999999 / 2000000]}
D / AsyncDownloadFile(2372):字节:1554167
D / AsyncDownloadFile(2372):字节:1554184
D / AsyncDownloadFile(2372):字节:1555208
D / AsyncDownloadFile(2372):字节:1555644
D / AsyncDownloadFile(2372):字节:1556668
D / AsyncDownloadFile(2372):字节:1557104

。
。
。

@ 4点37分10秒
D / AsyncDownloadFile(2372):字节:1939188
D / AsyncDownloadFile(2372):字节:1939624
D / AsyncDownloadFile(2372):字节:1940648
D / AsyncDownloadFile(2372):字节:1941084
D / AsyncDownloadFile(2372):新的下载求:1941084; lengthFile:2000000
D / dalvikvm(2372):GC_FOR_MALLOC释放13701对象/ 604600字节128ms的
D / AsyncDownloadFile(2372):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [58916],年龄= [0],服务器=
[YTS / 13年1月17日],接受-范围= [字节],日期= [星期五,2010年8月6日20时37分16秒格林尼治标准​​时间](续)
耳鼻喉科范围= [字节1941084-1999999 / 2000000]}
D / AsyncDownloadFile(2372):字节:1942108
D / AsyncDownloadFile(2372):字节:1942117
D / AsyncDownloadFile(2372):字节:1943141
D / AsyncDownloadFile(2372):字节:1943577
D / AsyncDownloadFile(2372):字节:1944601
D / AsyncDownloadFile(2372):字节:1945037

。
。
。

@ 4点38分30秒
D / AsyncDownloadFile(2372):字节:1993217
D / AsyncDownloadFile(2372):字节:1994241
D / AsyncDownloadFile(2372):字节:1994677
D / AsyncDownloadFile(2372):字节:1995701
D / AsyncDownloadFile(2372):字节:1996137
D / AsyncDownloadFile(2372):字节:1997161
D / AsyncDownloadFile(2372):字节:1997597
D / AsyncDownloadFile(2372):字节:1998621
D / AsyncDownloadFile(2372):字节:1999057
D / onPostExecute(2372):下载:失败

 -   -   - 
 

从BalusC(感谢)技巧后,我修改了连接设置,但在雅虎服务器继续复位到文件的每次中断的开始。这里的改变code和由此而来转储:

  //设置连接。
            网址URL =新的URL(strUrl [0]);
            URLConnection的连接= url.openConnection();
            下载的Integer.parseInt =(strUrl [3]);
            如果(下载== 0){
                connection.connect();
                strLastModified = connection.getHeaderField(上次修改);
                文件长度= connection.getContentLength();
                mDownloadFileLength =文件长度;
            }
            其他 {
                connection.setRequestProperty(范围,字节=+下载+ - );
                connection.setRequestProperty(如果-范围,strLastModified);
                connection.connect();
                文件长度= mDownloadFileLength;
                Log.d(AsyncDownloadFile
                        新的下载求:+下载+
                        ; lengthFile:+文件长度);
            }
            地图= connection.getHeaderFields();
            Log.d(AsyncDownloadFile,头字段:+ map.toString());
 


转储:

  @ 12:36:40开始
D / AsyncDownloadFile(413):头字段:{P3P = [policyref =HTTP://info.yahoo.c
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTP
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA P
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后-M
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [2000000],年龄= [0],SERV
R = [YTS / 13年1月17日],接受-范围= [字节],日期= [星期六,2010 8月7日4时36分56秒GMT]}
D / AsyncDownloadFile(413):字节:1024
D / AsyncDownloadFile(413):字节:2048
D / AsyncDownloadFile(413):字节:2476
D / AsyncDownloadFile(413):字节:3500
D / AsyncDownloadFile(413):字节:3936

...

@ 12:39:20中断
D / AsyncDownloadFile(413):字节:388068
D / AsyncDownloadFile(413):字节:389092
D / AsyncDownloadFile(413):字节:389376
D / AsyncDownloadFile(413):新的下载求:389376; lengthFile:2000000
D / AsyncDownloadFile(413):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [1610624],年龄= [0],服务
R = [YTS / 13年1月17日],接受-范围= [字节],日期= [星期六,2010 8月7日4点39分21秒格林尼治标准​​时间],合
ntent范围= [字节389376-1999999 / 2000000]}
D / AsyncDownloadFile(413):字节:390400
D / AsyncDownloadFile(413):字节:390409
D / AsyncDownloadFile(413):字节:391433
D / AsyncDownloadFile(413):字节:391869

...

@ 12:44:10中断
D / AsyncDownloadFile(413):字节:775413
D / AsyncDownloadFile(413):字节:775849
D / AsyncDownloadFile(413):字节:776873
D / AsyncDownloadFile(413):字节:777309
D / AsyncDownloadFile(413):新的下载求:777309; lengthFile:2000000
D / AsyncDownloadFile(413):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [1222691],年龄= [0],服务
R = [YTS / 13年1月17日],接受-范围= [字节],日期= [星期六,2010 8月7日4点44分20秒格林尼治标准​​时间],合
ntent范围= [字节777309-1999999 / 2000000]}
D / dalvikvm(413):GC_FOR_MALLOC释放10869对象/在122ms,完成数据465664字节
D / AsyncDownloadFile(413):字节:778333
D / AsyncDownloadFile(413):字节:778342
D / AsyncDownloadFile(413):字节:779366
D / AsyncDownloadFile(413):字节:779802

...

@ 12:49:30中断
D / AsyncDownloadFile(413):字节:1163782
D / AsyncDownloadFile(413):字节:1164806
D / AsyncDownloadFile(413):字节:1165​​242
D / AsyncDownloadFile(413):新的下载求:1165​​242; lengthFile:2000000
D / AsyncDownloadFile(413):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [834758],年龄= [0],服务器
= [YTS / 13年1月17日],接受-范围= [字节],日期= [星期六,2010 8月7日4时49分43秒格林尼治标准​​时间],CON
帐篷范围= [字节1165242-1999999 / 2000000]}
D / AsyncDownloadFile(413):字节:1166266
D / AsyncDownloadFile(413):字节:1167290
D / AsyncDownloadFile(413):字节:1167718
D / AsyncDownloadFile(413):字节:1168742

...

@ 12:55:30中断
D / AsyncDownloadFile(413):字节:1552722
D / AsyncDownloadFile(413):字节:1553158
D / AsyncDownloadFile(413):字节:1554182
D / AsyncDownloadFile(413):字节:1554618
D / AsyncDownloadFile(413):新的下载求:1554618; lengthFile:2000000
D / AsyncDownloadFile(413):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [445382],年龄= [0],服务器
= [YTS / 13年1月17日],接受-范围= [字节],日期= [星期六2010年8月7日4时55分39秒格林尼治标准​​时间],CON
帐篷范围= [字节1554618-1999999 / 2000000]}
D / AsyncDownloadFile(413):字节:1555642
D / AsyncDownloadFile(413):字节:1556666
D / AsyncDownloadFile(413):字节:1557094
D / AsyncDownloadFile(413):字节:1558118

...

@ 12:57:20中断
D / AsyncDownloadFile(413):字节:1941834
D / AsyncDownloadFile(413):字节:1942858
D / AsyncDownloadFile(413):字节:1943882
D / AsyncDownloadFile(413):字节:1943994
D / AsyncDownloadFile(413):新的下载求:1943994; lengthFile:2000000
D / AsyncDownloadFile(413):头字段:{P3P = [policyref =htt​​p://info.yahoo.co
M / W3C / p3p.xml,CP =CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDI CONI TELO OTPi
 我们的熟食店萨米·奥特里UNRI扑鼻IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
大号HEA pre LOC GOV],内容类型= [应用程序/压缩]​​,连接= [关闭],最后谟
dified = [星期五,2010年8月6日14时47分50秒格林尼治标准​​时间],内容长度= [56006],年龄= [0],服务器=
[YTS / 13年1月17日],接受-范围= [字节],日期= [星期六,2010 8月7日4点57分15秒格林尼治标准​​时间](续)
耳鼻喉科范围= [字节1943994-1999999 / 2000000]}
D / dalvikvm(413):GC_FOR_MALLOC释放13617对象/在165ms的602200字节
D / AsyncDownloadFile(413):字节:1945018
D / AsyncDownloadFile(413):字节:1946042
D / AsyncDownloadFile(413):字节:1946470
D / AsyncDownloadFile(413):字节:1947494

...

@ 12:58:10结束
D / AsyncDownloadFile(413):字节:1996103
D / AsyncDownloadFile(413):字节:1997127
D / AsyncDownloadFile(413):字节:1997563
D / AsyncDownloadFile(413):字节:1998587
D / AsyncDownloadFile(413):字节:1999023
D / onPostExecute(413):下载:不成功
 

解决方案

要恢复下载,您需要发送,不仅的 范围 请求头,而且还的 如果-范围 其中应包含的唯一文件标识符或文件修改时间请求头。

如果服务器返回 的ETag 在最初下载响应头,那么你应该使用它在随后的恢复请求如果-范围头。或者,如果它返回一个<一个href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.29"><$c$c>Last-Modified响应头,那么你应该使用它在如果-范围请求头代替。

看着你的日志,服务器发送一个的Last-Modified 响应头。所以,你应该回顺在简历中要求的如果-范围头发送。

  //初始下载。
字符串上次更改时间= connection.getHeaderField(上次修改);

// ...

//恢复下载。
connection.setRequestProperty(如果-范围,上次更改时间);
 

服务器将使用该信息来验证,如果你的要求完全一样的文件。

This is a continuation of my previous question which I posted when I wasn't a registered user. As a refresher, I'm trying to resume the downloading of a large file from my Yahoo! web site server when the download gets interrupted. I previously thought the interruption was due to a 100 second timeout limit (because Yahoo! enforces that time limit on user written scripts). However, when I measured the timing of the download interrupts, I saw that the interrupt timing varies a lot (sometimes the download runs uninterrupted for less than 100 seconds and sometimes up to seven minutes). So I don't know the reason for the timeouts and I'm just trying to work around them.

I tried the suggestion by naikus (thank you) and, according to the dump of http header fields, it appears that my Yahoo! web site server does recognize the "range" property that should allow the download to resume at the offset of the interruption. Unfortunately, although the byte range appears correct in the http header in the resumed connections, the transferred content always restarts at the beginning of the file. (My test file is an array of 50,000 4-byte integers that increments starting at 0. My downloaded file always starts recounting at 0 at every offset at which a download interrupt occurred.)

Is there some other http connection property request I should be making to get the Yahoo! server to actually skip to the file offset specified in the header's byte range? Here's the code and what it dumps:

         // Setup connection.
         URL url = new URL(strUrl[0]);
         URLConnection connection = url.openConnection();
         downloaded = Integer.parseInt(strUrl[3]);
         if (downloaded > 0) {
             connection.setRequestProperty("Range", "bytes="+downloaded+"-");
             connection.connect();
             fileLength = mDownloadFileLength;
             Log.d("AsyncDownloadFile", 
                 "new download seek: " + downloaded +
                 "; lengthFile: " + fileLength);
         }
         else {
             connection.connect();
             downloaded = 0;
             fileLength = connection.getContentLength();
             mDownloadFileLength = fileLength;
         }
         Map<String, List<String>> map = connection.getHeaderFields();
         Log.d("AsyncDownloadFile", "header fields: " + map.toString());

         // Setup streams and buffers.
         input = new BufferedInputStream(url.openStream(), 8192);
         outFile = new RandomAccessFile(strUrl[1], "rw");
         if (downloaded > 0)  
             outFile.seek(downloaded);
         byte data[] = new byte[1024];

         // Download file.
         for (int count=0, i=0; (count=input.read(data, 0, 1024)) != -1; i++) { 
             outFile.write(data, 0, count);
             downloaded += count; 
             if (downloaded >= fileLength)
                 break;

             // Display progress.
             Log.d("AsyncDownloadFile", "bytes: " + downloaded);
             if ((i%10) == 0)
                 publishProgress((int)(downloaded*100/fileLength));
             if (mFlagDisableAsyncTask) {
                 downloaded = 0;
                 break;
             }
         }

         // Close streams.
         outFile.close();
         input.close();


dump:

@ 4:08:24  
D/AsyncDownloadFile( 2372): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[2000000], age=[0], serve
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:08:33 GMT]}  
D/AsyncDownloadFile( 2372): bytes: 1024  
D/AsyncDownloadFile( 2372): bytes: 1033  
D/AsyncDownloadFile( 2372): bytes: 2057  
D/AsyncDownloadFile( 2372): bytes: 2493  
D/AsyncDownloadFile( 2372): bytes: 3517  
D/AsyncDownloadFile( 2372): bytes: 3953  

.
.
.

@ 4:13:25  
D/AsyncDownloadFile( 2372): bytes: 386473  
D/AsyncDownloadFile( 2372): bytes: 387497  
D/AsyncDownloadFile( 2372): bytes: 387933  
D/AsyncDownloadFile( 2372): new download seek: 387933; lengthFile: 2000000  
D/AsyncDownloadFile( 2372): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1612067], age=[0], serve
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:13:29 GMT], co
ntent-range=[bytes 387933-1999999/2000000]}  
D/AsyncDownloadFile( 2372): bytes: 388957  
D/AsyncDownloadFile( 2372): bytes: 389981  
D/AsyncDownloadFile( 2372): bytes: 390409  
D/AsyncDownloadFile( 2372): bytes: 391433  
D/AsyncDownloadFile( 2372): bytes: 391869  
D/AsyncDownloadFile( 2372): bytes: 392893  

.
.
.

@ 4:18:45  
D/AsyncDownloadFile( 2372): bytes: 775413  
D/AsyncDownloadFile( 2372): bytes: 775849  
D/AsyncDownloadFile( 2372): bytes: 776873  
D/AsyncDownloadFile( 2372): bytes: 777309  
D/AsyncDownloadFile( 2372): new download seek: 777309; lengthFile: 2000000  
D/AsyncDownloadFile( 2372): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1222691], age=[0], serve
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:18:54 GMT], co
ntent-range=[bytes 777309-1999999/2000000]}  
D/dalvikvm( 2372): GC_FOR_MALLOC freed 11019 objects / 470560 bytes in 155ms  
D/AsyncDownloadFile( 2372): bytes: 778333  
D/AsyncDownloadFile( 2372): bytes: 779357  
D/AsyncDownloadFile( 2372): bytes: 779790  
D/AsyncDownloadFile( 2372): bytes: 780814  
D/AsyncDownloadFile( 2372): bytes: 781250  
D/AsyncDownloadFile( 2372): bytes: 782274  

.
.
.

@ 4:23:45  
D/AsyncDownloadFile( 2372): bytes: 1163334  
D/AsyncDownloadFile( 2372): bytes: 1163770  
D/AsyncDownloadFile( 2372): bytes: 1164794  
D/AsyncDownloadFile( 2372): bytes: 1165230  
D/AsyncDownloadFile( 2372): new download seek: 1165230; lengthFile: 2000000  
D/AsyncDownloadFile( 2372): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[834770], age=[0], server
=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:23:47 GMT], con
tent-range=[bytes 1165230-1999999/2000000]}  
D/AsyncDownloadFile( 2372): bytes: 1166246  
D/AsyncDownloadFile( 2372): bytes: 1167270  
D/AsyncDownloadFile( 2372): bytes: 1167706  
D/AsyncDownloadFile( 2372): bytes: 1168730  
D/AsyncDownloadFile( 2372): bytes: 1169754  
D/AsyncDownloadFile( 2372): bytes: 1170778  

.
.
.

@ 4:30:25  
D/AsyncDownloadFile( 2372): bytes: 1551255  
D/AsyncDownloadFile( 2372): bytes: 1551691  
D/AsyncDownloadFile( 2372): bytes: 1552715  
D/AsyncDownloadFile( 2372): bytes: 1553151  
D/AsyncDownloadFile( 2372): new download seek: 1553151; lengthFile: 2000000  
D/AsyncDownloadFile( 2372): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[446849], age=[0], server
=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:30:44 GMT], con
tent-range=[bytes 1553151-1999999/2000000]}  
D/AsyncDownloadFile( 2372): bytes: 1554167  
D/AsyncDownloadFile( 2372): bytes: 1554184  
D/AsyncDownloadFile( 2372): bytes: 1555208  
D/AsyncDownloadFile( 2372): bytes: 1555644  
D/AsyncDownloadFile( 2372): bytes: 1556668  
D/AsyncDownloadFile( 2372): bytes: 1557104  

.
.
.

@ 4:37:10  
D/AsyncDownloadFile( 2372): bytes: 1939188  
D/AsyncDownloadFile( 2372): bytes: 1939624  
D/AsyncDownloadFile( 2372): bytes: 1940648  
D/AsyncDownloadFile( 2372): bytes: 1941084  
D/AsyncDownloadFile( 2372): new download seek: 1941084; lengthFile: 2000000  
D/dalvikvm( 2372): GC_FOR_MALLOC freed 13701 objects / 604600 bytes in 128ms
D/AsyncDownloadFile( 2372): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[58916], age=[0], server=
[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:37:16 GMT], cont
ent-range=[bytes 1941084-1999999/2000000]}  
D/AsyncDownloadFile( 2372): bytes: 1942108  
D/AsyncDownloadFile( 2372): bytes: 1942117  
D/AsyncDownloadFile( 2372): bytes: 1943141  
D/AsyncDownloadFile( 2372): bytes: 1943577  
D/AsyncDownloadFile( 2372): bytes: 1944601  
D/AsyncDownloadFile( 2372): bytes: 1945037  

.
.
.

@ 4:38:30  
D/AsyncDownloadFile( 2372): bytes: 1993217  
D/AsyncDownloadFile( 2372): bytes: 1994241  
D/AsyncDownloadFile( 2372): bytes: 1994677  
D/AsyncDownloadFile( 2372): bytes: 1995701  
D/AsyncDownloadFile( 2372): bytes: 1996137  
D/AsyncDownloadFile( 2372): bytes: 1997161  
D/AsyncDownloadFile( 2372): bytes: 1997597  
D/AsyncDownloadFile( 2372): bytes: 1998621  
D/AsyncDownloadFile( 2372): bytes: 1999057  
D/onPostExecute( 2372): download: unsuccessful  

- - -  

After the tip from BalusC (thanks), I modified the connection setup but the Yahoo! server continues to reset to the start of the file at each interrupt. Here's the changed code and the resulting dumps:

            // Setup connection.
            URL url = new URL(strUrl[0]);
            URLConnection connection = url.openConnection();
            downloaded = Integer.parseInt(strUrl[3]);
            if (downloaded == 0) {
                connection.connect();
                strLastModified = connection.getHeaderField("Last-Modified");
                fileLength = connection.getContentLength();
                mDownloadFileLength = fileLength;
            }
            else {
                connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
                connection.setRequestProperty("If-Range", strLastModified);
                connection.connect();
                fileLength = mDownloadFileLength;
                Log.d("AsyncDownloadFile", 
                        "new download seek: " + downloaded +
                        "; lengthFile: " + fileLength);
            }
            map = connection.getHeaderFields();
            Log.d("AsyncDownloadFile", "header fields: " + map.toString());


dump:

@12:36:40 started  
D/AsyncDownloadFile(  413): header fields: {p3p=[policyref="http://info.yahoo.c
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTP
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA P
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-m
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[2000000], age=[0], serv
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:36:56 GMT]}  
D/AsyncDownloadFile(  413): bytes: 1024  
D/AsyncDownloadFile(  413): bytes: 2048  
D/AsyncDownloadFile(  413): bytes: 2476  
D/AsyncDownloadFile(  413): bytes: 3500  
D/AsyncDownloadFile(  413): bytes: 3936  

...

@12:39:20 interrupted  
D/AsyncDownloadFile(  413): bytes: 388068  
D/AsyncDownloadFile(  413): bytes: 389092  
D/AsyncDownloadFile(  413): bytes: 389376  
D/AsyncDownloadFile(  413): new download seek: 389376; lengthFile: 2000000  
D/AsyncDownloadFile(  413): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1610624], age=[0], serve
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:39:21 GMT], co
ntent-range=[bytes 389376-1999999/2000000]}  
D/AsyncDownloadFile(  413): bytes: 390400  
D/AsyncDownloadFile(  413): bytes: 390409  
D/AsyncDownloadFile(  413): bytes: 391433  
D/AsyncDownloadFile(  413): bytes: 391869  

...

@12:44:10 interrupted  
D/AsyncDownloadFile(  413): bytes: 775413  
D/AsyncDownloadFile(  413): bytes: 775849  
D/AsyncDownloadFile(  413): bytes: 776873  
D/AsyncDownloadFile(  413): bytes: 777309  
D/AsyncDownloadFile(  413): new download seek: 777309; lengthFile: 2000000  
D/AsyncDownloadFile(  413): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1222691], age=[0], serve
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:44:20 GMT], co
ntent-range=[bytes 777309-1999999/2000000]}  
D/dalvikvm(  413): GC_FOR_MALLOC freed 10869 objects / 465664 bytes in 122ms  
D/AsyncDownloadFile(  413): bytes: 778333  
D/AsyncDownloadFile(  413): bytes: 778342  
D/AsyncDownloadFile(  413): bytes: 779366  
D/AsyncDownloadFile(  413): bytes: 779802  

...

@12:49:30 interrupted  
D/AsyncDownloadFile(  413): bytes: 1163782  
D/AsyncDownloadFile(  413): bytes: 1164806  
D/AsyncDownloadFile(  413): bytes: 1165242  
D/AsyncDownloadFile(  413): new download seek: 1165242; lengthFile: 2000000  
D/AsyncDownloadFile(  413): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[834758], age=[0], server
=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:49:43 GMT], con
tent-range=[bytes 1165242-1999999/2000000]}  
D/AsyncDownloadFile(  413): bytes: 1166266  
D/AsyncDownloadFile(  413): bytes: 1167290  
D/AsyncDownloadFile(  413): bytes: 1167718  
D/AsyncDownloadFile(  413): bytes: 1168742  

...

@12:55:30 interrupted  
D/AsyncDownloadFile(  413): bytes: 1552722  
D/AsyncDownloadFile(  413): bytes: 1553158  
D/AsyncDownloadFile(  413): bytes: 1554182  
D/AsyncDownloadFile(  413): bytes: 1554618  
D/AsyncDownloadFile(  413): new download seek: 1554618; lengthFile: 2000000  
D/AsyncDownloadFile(  413): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[445382], age=[0], server
=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:55:39 GMT], con
tent-range=[bytes 1554618-1999999/2000000]}  
D/AsyncDownloadFile(  413): bytes: 1555642  
D/AsyncDownloadFile(  413): bytes: 1556666  
D/AsyncDownloadFile(  413): bytes: 1557094  
D/AsyncDownloadFile(  413): bytes: 1558118  

...

@12:57:20 interrupted  
D/AsyncDownloadFile(  413): bytes: 1941834  
D/AsyncDownloadFile(  413): bytes: 1942858  
D/AsyncDownloadFile(  413): bytes: 1943882  
D/AsyncDownloadFile(  413): bytes: 1943994  
D/AsyncDownloadFile(  413): new download seek: 1943994; lengthFile: 2000000  
D/AsyncDownloadFile(  413): header fields: {p3p=[policyref="http://info.yahoo.co
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi
 OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[56006], age=[0], server=
[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:57:15 GMT], cont
ent-range=[bytes 1943994-1999999/2000000]}  
D/dalvikvm(  413): GC_FOR_MALLOC freed 13617 objects / 602200 bytes in 165ms  
D/AsyncDownloadFile(  413): bytes: 1945018  
D/AsyncDownloadFile(  413): bytes: 1946042  
D/AsyncDownloadFile(  413): bytes: 1946470  
D/AsyncDownloadFile(  413): bytes: 1947494  

...

@12:58:10 finished  
D/AsyncDownloadFile(  413): bytes: 1996103  
D/AsyncDownloadFile(  413): bytes: 1997127  
D/AsyncDownloadFile(  413): bytes: 1997563  
D/AsyncDownloadFile(  413): bytes: 1998587  
D/AsyncDownloadFile(  413): bytes: 1999023  
D/onPostExecute(  413): downloaded: unsuccessful  

解决方案

To resume a download, you need to send not only the Range request header, but also the If-Range request header which should contain either the unique file identifier or the file modification timestamp.

If the server returns an ETag response header on the initial download, then you should use it in the If-Range header of the subsequent resume requests. Or if it returns a Last-Modified response header, then you should use it in the If-Range request header instead.

Looking at your logs, the server has sent a Last-Modified response header. So you should send it back along in an If-Range header of the resume request.

// Initial download.
String lastModified = connection.getHeaderField("Last-Modified");

// ...

// Resume download.
connection.setRequestProperty("If-Range", lastModified); 

The server will use this information to verify if you're requesting exactly the same file.

这篇关于如何恢复中断的下载 - 第2部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆