如何判断服务器是否支持断点续传?(300分)

  • 主题发起人 主题发起人 LuckyJackie
  • 开始时间 开始时间
L

LuckyJackie

Unregistered / Unconfirmed
GUEST, unregistred user!
如何判断服务器是否支持断点续传?包括http与ftp,最好使用indy,其它方案亦可.
 
http://www.delphifans.com/SoftView/SoftView_520.html

参考
 
1.HTTP 判断服务器是否支持断点续传,使用IdHTTP组件
procedure TForm1.Button4Click(Sender: TObject);
begin
try
IdHTTP.Request.ContentRangeStart := 2; //设定断点续传的开始位置
IdHTTP.Request.ContentRangeEnd := 3; //设置传输的结束位置,为了以最快的速度返回结果,所以设定请求的总长度为1
IdHTTP.Get('http://sq3.onlinedown.net/down/SkynetPFW_Subscription_Release_v2.77_Build0222.EXE');
if IdHTTP.Response.ResponseCode = 206 then //根据返回代码判断是否支持断点续传
ShowMessage('该FTP站点支持断点续传。')
else
ShowMessage('该FTP站点不支持断点续传。')
except
end;
end;

2.FTP 判断服务器是否支持断点续传,使用IdFTP组件
procedure TForm1.Button3Click(Sender: TObject);
var
iValue: Integer;
begin
with IdFTP do
try
if Connected then Disconnect;
Username := 'anonymous'; //这是FTP的用户名
Password := 'test@ftp.com'; //只是FTP的密码
Host := 'ftp.globalscape.com'; //FTP站点地址,前面不要带ftp://
Port := 21;
Connect;
except
exit;
end;

try
iValue := IdFTP.SendCmd('REST 1'); //发送指令判断是否支持断点续传
if iValue = 350 then
ShowMessage('该FTP站点支持断点续传。')
else
ShowMessage('该FTP站点不支持断点续传。')
except
end;
end;
 
liyinwei你好,很高兴又见到你了!
*****************************************************************
IdHTTP.Request.ContentRangeStart := 2; //设定断点续传的开始位置
IdHTTP.Request.ContentRangeEnd := 3; //设置传输的结束位置,为了以最快的速度返回结果,所以设定请求的总长度为1
*****************************************************************
这里的总长度为应该为2,用get是可以判断,不过是否有不用下载数据的做法?我曾经试过用head(其他同你的程序差不多),可是好像有些服务器支持返回content-length为所设定的范围,有的还是返回整个文件的大小。
 
哈哈!楼主,真不好意思,这几天实在是太忙了,没有时间顾得上看你这帖子!
我追踪IdHTTP的源代码,发现了使用IdHTTP的Head方法的时候 ContentRangeStart 和 ContentRangeEnd 是不起作用的。
楼主看看IdHTTP单元的TIdCustomHTTP.DoRequest过程就会明白。
还有,测试的时候不需要总Get一个指定的文件,可以直接Get网站的地址,如:
Get('http://www.163.com');
但是有些网站如果不指定文件,ResponseCode 就会返回200,而不是206,但是该网站有确实是支持断点续传的,如果遇到这种情况建议楼主当接收到200返回码的时候再次Get一下,但是这次要使用指定文件地址的方法,如:
用Get('http://www.sina.com.cn');
总是返回200的 ResponseCode ,但是用
Get('http://www.sina.com.cn/index.html');
就会返回206的ResponseCode ,看来这个Get还是需要灵活运用的。
如果楼主有更好的解决办法,也希望能共享一下,学习学习。
 
**************************************
发现了使用IdHTTP的Head方法的时候 ContentRangeStart 和 ContentRangeEnd 是不起作用的。
**************************************
我也遇到过,并对它的源代码进行过调试,我怀疑这是indy 10.0的一个bug,因为9.0是可以的.
使用head方式的话,有的服务器返回206,有的却只返回200,但如果用get,又都可以返回206,其中缘由, 不解!不知道这里还有高手无?
 
这不是indy 10.0的Bug,因为我用的正是9.0。
其实Head方法也是调用了Get方法,而Get方法调用了DoRequest方法。
DoRequest方法里面会判断传进来的TStream类型的参数,如果不为nil才会采用 ContentRangeStart 和 ContentRangeEnd 属性。
关于为什么有的返回200,这真的要高手们显显身手了,只好帮楼主顶一下。
 
REST
通常Http通过
它来确定发送的流的位置
 
to iamy,
能否给一个实例?
 
看来高手们都回家种田去了,嗨。。。
 
用wininet 的InternetSetFilePointer这个函数,如果返回错就是不支持
 
var
hOpen, hConnect, hResource: HINTERNET;
DataProceed: array[0..8191] of Byte;
numread: DWORD;
begin
hOpen := InternetOpen('WinInet resuming sample', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
hConnect := InternetConnect(hOpen, PChar(host), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
hResource := HttpOpenRequest(hConnect, 'GET', PChar(resource), nil, nil, nil, 0, 0);
HttpSendRequest(hResource, nil, 0, nil, 0);

InternetSetFilePointer(hResource, Position, nil, FILE_BEGIN, 0)
releat
InternetReadFile(hResource, @DataProceed, SizeOf(DataProceed), numread);
...
until (numread <= 0);

InternetCloseHandle(hConnect);
InternetCloseHandle(hOpen);
end;
 
顶一下,关注,希望能找到答案,附送测试地址
'http://www.britney-now.com/video/video_files/boys(remix).ram'
IdHTTP返回的是200,无忌的position不知道是什么,InternetSetFilePointer返回非0
 
to ufo!,
收藏需付银子50。。。
 
银子好说,我还有几个贴久拖不决的,你帮忙解决解决,分给100
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3065592
 
liyinwei你好,
先前的200分已经给你了,请查收。
 
FTP的方法基本定型,希望能够找到HTTP的较为完善方案。
 
现在的问题在于:

使用head方式的话,有的服务器返回206,有的却只返回200,但如果用get,又都可以返回206,

呼唤高手。。。
 
http版本1.0和0.9不支持,1.1支持
 
后退
顶部