文档章节

Delphi用ICS控件进行断点续传

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

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

葡萄城控件技术团队
2016/06/15
22
0

没有更多内容

加载失败,请刷新页面

加载更多

搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
今天
2
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
3
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
1
0
OSChina 周四乱弹 —— 上帝对我单身年限的惩罚越来越长了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享张卫健的单曲《身体健康》 《身体健康》- 张卫健 手机党少年们想听歌,请使劲儿戳(这里) 昨天是重阳节咯, 可惜小小编辑总是晚...

小小编辑
今天
12
1
django rest framework 外键序列化方法与问题总结

django rest framework 外键序列化方法与问题总结 当借口中需要出现一对多关系的时候,我们可以用rest_framwork的序列化功能来处理,代码如下. # models.pyfrom django.db import modelscl...

_Change_
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部