文档章节

Delphi用ICS控件进行断点续传

vga
 vga
发布于 2014/06/07 16:10
字数 855
阅读 1062
收藏 4
点赞 0
评论 0

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

粉丝 19
博文 336
码字总数 23533
作品 0
佳木斯
python 多用户在线的FTP程序

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

tryagaintry ⋅ 2017/09/28 ⋅ 0

解读断点续传的基本原理

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

bengozhong ⋅ 2016/08/31 ⋅ 0

NSURLSessionDownloadTask的后台下载与断点续传

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

xiaobai1315 ⋅ 2016/09/21 ⋅ 0

Winform文件下载之断点续传

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

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

android 中断点续传理解

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

origin ⋅ 2012/04/27 ⋅ 0

Xutils下载,断点续传功能,显示进度错乱

大家好,我正在使用Xutils进行项目中的断点续传,作者在文档中写到如果支持断点续传必须服务器端支持RANGE,在运行过程中如果不断点正常下载,但是只要一暂停,回调onloading的total值就会变...

艾东磊 ⋅ 2014/11/18 ⋅ 3

关于百度网盘中多文件打包下载并支持断点续传的技术实现

今天发现百度网盘中觉得一个很牛的功能,多文件打包下载并支持多线程以及断点续传 单从多文件打包下载这一点来说,实现起来很容易,创建一个压缩输出流即可: 但是这样只能进行单线程下载,并...

三千水军保裆 ⋅ 05/12 ⋅ 0

Xutils下载,断点续传功能,显示进度错乱

@艾东磊 你好,想跟你请教个问题: 关于这个问题“大家好,我正在使用Xutils进行项目中的断点续传,作者在文档中写到如果支持断点续传必须服务器端支持RANGE,在运行过程中如果不断点正常下载...

523418624 ⋅ 2016/04/16 ⋅ 0

LazyCode 自己开源的一个类库

LazyCode 是什么? LazyCode 一个懒人用的代码类库,包括的模块:网络请求,数据存储,UIKit ,Foundation的一些类目 PHNetWorkClient 功能 1:发送GET PSOT Delete PUT 请求 2:使用的URL缓存 ...

人魔七七 ⋅ 2015/06/09 ⋅ 0

web服务器适合文件上传下载服务吗?

不去说具体的什么大文件、断点续传。我想问的是上传对服务器并发的影响。 假设线程池为200,如果有200个人同时在上传文件(小文件的话线程占满的情况小点,但是如果传的文件大点,就会导致同...

铂金小虫 ⋅ 2014/10/30 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hive函数

1.函数explode (一转多) create table hive_wc(sentence string); load data local inpath '/home/hadoop/data/hive-wc.txt' into table hive_wc; 结果: hive > select * from hive_wc; ......

GordonNemo ⋅ 27分钟前 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 45分钟前 ⋅ 0

使用Java connector消费ABAP系统的函数

Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDIS_GET_UPSELL_MATERIALS,输入一个customer ID和product ID,会输......

JerryWang_SAP ⋅ 50分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部