文档章节

Delphi用ICS控件进行断点续传

vga
 vga
发布于 2014/06/07 16:10
字数 855
阅读 1065
收藏 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
博文 354
码字总数 23769
作品 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
Winform文件下载之断点续传

在本系列的前两篇文章中,分别向大家介绍了用于完成下载任务的 WebClinet 和 WinINet 的基本用法和一些实用技巧。 今天来为大家讲述下载过程中最常遇到的断点续传问题。 首先明确一点,本文所...

葡萄城控件技术团队
2016/06/15
22
0
android 中断点续传理解

断点续传之前我们首先需要了解http协议 断点续传简单的说,就是接着上一次的已经下载好的位置接着下载文件,如何接着以前已经下载的位置接着下载,这是我们要解决的问题. http header详解参考h...

origin
2012/04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部