当前位置:主页>销售管理软件> 列表

如何判断服务器是否支持断点续传? 找进销存软件下载

进销存软件版1楼: 如何判断服务器是否支持断点续传?包括http与ftp,最好使用indy,其它方案亦可.

2楼: http://www.delphifans.com/SoftView/SoftView_520.html

参考 如手机进销存管理系统

3楼: 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;

4楼: liyinwei你好,很高兴又见到你了!
*****************************************************************
IdHTTP.Request.ContentRangeStart := 2; //设定断点续传的开始位置
IdHTTP.Request.ContentRangeEnd := 3; //设置传输的结束位置,为了以最快的速度返回结果,所以设定请求的总长度为1
*****************************************************************
这里的总长度为应该为2,用get是可以判断,不过是否有不用下载数据的做法?我曾经试过用head(其他同你的程序差不多),可是好像有些服务器支持返回content-length为所设定的范围,有的还是返回整个文件的大小。

5楼: 哈哈!楼主,真不好意思,这几天实在是太忙了,没有时间顾得上看你这帖子!


我追踪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还是需要灵活运用的。
如果楼主有更好的解决办法,也希望能共享一下,学习学习。

6楼: **************************************
发现了使用IdHTTP的Head方法的时候 ContentRangeStart 和 ContentRangeEnd 是不起作用的。
**************************************
我也遇到过,并对它的源代码进行过调试,我怀疑这是indy 10.0的一个bug,因为9.0是可以的.
使用head方式的话,有的服务器返回206,有的却只返回200,但如果用get,又都可以返回206,其中缘由, 不解!不知道这里还有高手无?

进销存软件版7楼: 这不是indy 10.0的Bug,因为我用的正是9.0。
其实Head方法也是调用了Get方法,而Get方法调用了DoRequest方法。
DoRequest方法里面会判断传进来的TStream类型的参数,如果不为nil才会采用 ContentRangeStart 和 ContentRangeEnd 属性。
关于为什么有的返回200,这真的要高手们显显身手了,只好帮楼主顶一下。

8楼: REST
通常Http通过
它来确定发送的流的位置

9楼: to iamy,
能否给一个实例?

10楼: 看来高手们都回家种田去了,嗨。。。

11楼: 用wininet 的InternetSetFilePointer这个函数,如果返回错就是不支持

12楼: 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; 如进销存软件下载

13楼: 顶一下,关注,希望能找到答案,附送测试地址
''http://www.britney-now.com/video/video_files/boys(remix).ram''
IdHTTP返回的是200,无忌的position不知道是什么,InternetSetFilePointer返回非0

进销存软件版14楼: 收藏此贴

15楼: to ufo!,
收藏需付银子50。。。

16楼: 银子好说,我还有几个贴久拖不决的,你帮忙解决解决,分给100
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3065592

17楼: liyinwei你好,
先前的200分已经给你了,请查收。

18楼: FTP的方法基本定型,希望能够找到HTTP的较为完善方案。

19楼: 现在的问题在于:

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

呼唤高手。。。

20楼: http版本1.0和0.9不支持,1.1支持

进销存软件版21楼: 多人接受答案了。