文档章节

Delphi用ICS控件进行断点续传

vga
 vga
发布于 2014/06/07 16:10
字数 855
阅读 1071
收藏 4

Delphi用ICS控件进行断点续传

原帖地址:http://www.lonetear.net/bbs/read.asp?id=36143

原帖地址2(傻猫):http://www.samool.com/archives/41252/

用HTTPCLI和NMHTTP都可以实现断点续传,原理都一样,但是由于HTTPCLI支持带用户名和密码的HTTP代理,NMHTTP不支持,HTTPCLI还支持SOCK4、SOCK5代理,因此我选用HTTPCLI来实现。

主要是通过HTTPCLI的ContentRangeBegin和ContentRangeEnd属性来控制,ContentRangeBegin是指从哪个字节开始下载,ContentRangeEnd是指下载到哪个字节为止,如果留空则表示下载到文件结束。例如
httpcli1.ContentRangeBegin:='100';  //从100字节的位置开始下载
httpcli1.ContentRangeEnd:='200';    //下载到200字节的地方停止

httpcli1.ContentRangeBegin:='100';  //从100字节的位置开始下载
httpcli1.ContentRangeEnd:='';    //下载到文件结束
看下面的例子
var
 f:TSearchRec;

FindFirst(fname,faAnyFile,f);
httpcli1.ContentRangeBegin:=inttostr(f.Size);
httpcli1.ContentRangeEnd:='';
Httpcli1.RcvdStream:=TFileStream.Create(fname,fmOpenReadWrite);
httpcli1.url:='xxxxxxx';//一个URL地址
httpcli1.Get;
Httpcli1.RcvdStream.Destroy;
Httpcli1.RcvdStream:= nil;
很奇怪的是,用了上面的语句,续传是续传了,但是续传的内容总是把先前的内容覆盖了,开始以为是Httpcli1.RcvdStream:=TFileStream.Create(fname,fmOpenReadWrite);中fmOpenReadWrite参数的问题,换完了所有的参数问题依旧,后来在网上看到一些相关的C++例程,受到一点启发,其实续传的代码没有错,错在对文件的处理上,当TFileStream.Create之后,文件指针的位置默认是文件开头,应当把文件指针指向结尾,修正后的代码如下:

var
 fs:TFileStream;

fs:=TFileStream.Create(fname,fmOpenReadWrite);
fs.Position:=fs.size; //将文件指针移到文件的结尾,用SEEK也可实现
httpcli1.ContentRangeBegin:=fs.Size;
httpcli1.ContentRangeEnd:='';
Httpcli1.RcvdStream:=fs;
httpcli1.url:='xxxxxxx';//一个URL地址
httpcli1.Get;
fs.free;

用以上的代码完全可以实现断点续传,目前还有一个问题没有解决,如果下载的URL是一个动态脚本的话,例如ASP文件,在ASP文件中如果发生了
response.redirect使URL动态改变,断点续传就无法实现,在HTTPCLI的locationchange事件中showmessage(httpcli1.url);发现虽然ASP文件中用REDIRECT改变了URL,但是HTTPCLI的URL并没有更新,估计这是无法续传的原因。
欢迎大家继续讨论。 ------------------------------------------------

现在的下载软件一般都是多线程,多资源的下载模式,本文用ICS中的TMultipartHttpDownloader组件实现多线程,单资源的分块下载模式,鲁大师的升级就是这样的原理,可以参考.
先看组件的几个事件:
HTTPRequestDone(Sender: TObject; ErrorCode: Integer; const Reason: string);
下载完成事件,在这里可以释放下载的文件流
 FMultiPartHTTP.FileStream.Free;
 FMultiPartHTTP.FileStream := nil;
HTTPShowStats(Sender: TObject);
下载显示状态信息事件
 '已下载(MB):' + Format('%2f',[FMultiPartHTTP.TotalCount / 1024 / 1024]) +
 ' 完成:' + Format('%3.0f', [FMultiPartHTTP.PercentDone])+'%' +
 ' 速度(KB/秒):' + Format('%6.2f', [FMultiPartHTTP.CurSpeed]) +
 ' 耗时:' + FormatDateTime('hh:nn:ss', FMultiPartHTTP.ElapsedTime);
下面2个事件和进度条有关,ICS自带了个下载进度条
HTTPProgressAddSegment(Sender: TObject; StartOffset, ASpan, InitPos: Int64);
ASpan分段大小,InitPos分段开始大小, StartOffset,分段开始大小
HTTPProgressSetPosition(Sender: TObject;Index: Integer; Position: Int64);
Index第几个分段 Position 分段已下载的大小
下面是用法,非常简单:
   FMultiPartHTTP.URL:=下载文件地址;
   FMultiPartHTTP.PartCount:=分块个数;
   FMultiPartHTTP.FileStream:=TFileStream.Create('下载本地文件名',fmCreate);
   FMultiPartHTTP.Start;
注意:PartCount要大于1,这个组件支持断网断点下载,如果要控制下载的线程数量需要改ICS的源代码

本文转载自:http://www.lonetear.net/bbs/read.asp?id=36143

共有 人打赏支持
vga

vga

粉丝 21
博文 362
码字总数 24609
作品 0
佳木斯
私信 提问
delphi idftp idhttp 多线程多进度条

idftp 上传 多个文件同时上传,支持断点续传,多进度条。 起初用API做,发现对API了解太少,便改用线程类来处理,代码如下 TThread1 = class(TThread) private fCount, tstart, tlast: integ...

dillonxiao
09/29
0
0
python 多用户在线的FTP程序

要求: 1、用户加密认证 2、允许同时多用户登录 3、每个用户有自己的家目录 ,且只能访问自己的家目录 4、对用户进行磁盘配额,每个用户的可用空间不同 5、允许用户在ftp server上随意切换目...

tryagaintry
06/26
0
0
解读断点续传的基本原理

断点续传的理解可以分为两部分:一部分是断点,一部分是续传。断点的由来是在下载过程中,将一个下载文件分成了多个部分,同时进行多个部分一起 的下载,当某个时间点,任务被暂停了,此时下...

bengozhong
2016/08/31
21
0
NSURLSessionDownloadTask的后台下载与断点续传

对于后台下载与断点续传相信大家肯定不会陌生,那么如果要同时实现这两种需求该怎么办呢? 使用NSURLSessionDataTask可以很轻松实现断点续传,可是有个致命的缺点就是无法进行后台下载,一点应用...

xiaobai1315
2016/09/21
73
0
【最佳实践】OSS开源工具ossutil-大文件断点续传

经常碰到内部同学或者外部客户问ossutil关于大文件断点续传的问题。本文简单描述下原理并举例说明。 用户可从这里获取ossutil。 官网:https://help.aliyun.com/documentdetail/50452.html 代...

Mr_zebra
10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache Sentry架构介绍

cdh版本的hadoop在对数据安全上的处理通常采用Kerberos+Sentry的结构。 kerberos主要负责平台用户的权限管理,sentry则负责数据的权限管理。 下面我们来依次了解一下: Kerberos包含一个中心...

hblt-j
25分钟前
0
0
First Bad Version(leetcode278)

You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is......

woshixin
31分钟前
1
0
executor 和task 优先于线程(68)

java.util.concurrent 包里有一个Executor 框架 基于接口的任务执行工具 只需要一行代码 提交一个runnable 方法 优雅的终止(必须做到,不然虚拟机可能不会退出) 对于负载不重的服务 Execut...

Java搬砖工程师
31分钟前
1
0
一条SQL查询语句是如何执行的

123

writeademo
33分钟前
3
0
CSS中position属性( absolute | relative | static | fixed )详解

四个属性的特点 static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用。 relative:对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流...

简心
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部