`
youthon
  • 浏览: 18491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ftp和http断点续传及下载delphi实现

 
阅读更多

接下来我们来写最主要的代码,也就是下载部分了,首先来看HTTP协议的:
procedureTForm1.HttpDownLoad(aURL,aFile:string;bResume:Boolean);
var
tStream:TFileStream;
begin//Http方式下载
ifFileExists(aFile)then//如果文件已经存在
tStream:=TFileStream.Create(aFile,fmOpenWrite)else
tStream:=TFileStream.Create(aFile,fmCreate);

ifbResumethen//续传方式
begin
IdHTTP1.Request.ContentRangeStart:=tStream.Size-1;
tStream.Position:=tStream.Size-1;//移动到最后继续下载
IdHTTP1.Head(aURL);
IdHTTP1.Request.ContentRangeEnd:=IdHTTP1.Response.ContentLength;
endelse//覆盖或新建方式
begin
IdHTTP1.Request.ContentRangeStart:=0;
end;


try
IdHTTP1.Get(aURL,tStream);//开始下载
finally
tStream.Free;
end;
end;
这里我们同样使用IdHTTP的Get过程,函数的aURL是网址,aFile是保存的文件名,bResume确定是否续传,需要注意的就是续传方式时的代码:
IdHTTP1.Request.ContentRangeStart:=tStream.Size-1;
tStream.Position:=tStream.Size-1;//移动到最后继续下载
IdHTTP1.Head(aURL);
IdHTTP1.Request.ContentRangeEnd:=IdHTTP1.Response.ContentLength;
第一行我们将下载开始位置设置为读入文件流的末尾,也就是设置为已经下载了的那部分文件的大小,第二行我们将文件流本身也指向自己的末尾,第三行我们通过Head过程得到网址头信息,在第四行将头信息的文件总大小赋值给下载的结束的位置,至于这里为什么第一行和第二行代码最后都要-1,我当时没有加-1的时候在续下载一个完整的已经下载的文件的时候总是提示错误,最后跟踪IdHTTP的代码发现他在处理下载范围的时候如果开始的位置和结束位置一样时会引发将浮点数转为整数的错误,因而这里加上-1防止这种错误发生,另外一种处理方法就是比较如果开始位置等于结束位置就退出也是可以的。
再来看FTP协议的下载过程:
procedureTForm1.FtpDownLoad(aURL,aFile:string;bResume:Boolean);
var
tStream:TFileStream;
sName,sPass,sHost,sPort,sDir:string;
begin//ftp方式下载
ifFileExists(aFile)then//建立文件流
tStream:=TFileStream.Create(aFile,fmOpenWrite)else
tStream:=TFileStream.Create(aFile,fmCreate);

GetFTPParams(aURL,sName,sPass,sHost,sPort,sDir);
withIdFTP1do
try
ifConnectedthenDisconnect;//重新连接
Username:=sName;
Password:=sPass;
Host:=sHost;
Port:=StrToInt(sPort);
Connect;
except
exit;
end;

IdFTP1.ChangeDir(sDir);//改变目录
BytesToTransfer:=IdFTP1.Size(aFile);
try
ifbResumethen//续传
begin
tStream.Position:=tStream.Size;
IdFTP1.Get(aFile,tStream,True);
endelse
begin
IdFTP1.Get(aFile,tStream,False);
end;
finally
tStream.Free;
end;
end;
这个过程中我们就用到了GetFTPParams()函数将网址的用户名、密码、主机地址、端口、路径等信息分离出来,IdFTP利用这些信息登陆服务器并到相应目录,最后利用Get()过程就很容易实现下载了,它的续传就比HTTP协议要简单很多,因为IdFTP的Get()本身就支持续传。
这里我简单穿插一点的内容,一个服务器是否支持断点续传,我们可以通过发送"REST1"FTP指令来检测,如果返回350则表示支持。
最后我们根据网址来确定使用什么协议来下载:
functionTForm1.GetProt(aURL:string):Byte;
begin//检测下载的地址是http还是ftp
Result:=0;
ifPos('http',LowerCase(aURL))=1then
Result:=1;//http协议
ifPos('ftp',LowerCase(aURL))=1then
Result:=2;//ftp协议
end;
这个函数根据网址返回整数供我们使用。
procedureTForm1.MyDownLoad(aURL,aFile:string;bResume:Boolean);
begin
caseGetProt(aURL)of
0:ShowMessage('不可识别的地址!');
1:HttpDownLoad(aURL,aFile,bResume);
2:FtpDownLoad(aURL,aFile,bResume);
end;
end;
这个过程就利用GetProt()函数返回的整数执行相应的协议下载过程。
(2)接下来看看每个按钮的代码,有了上面的函数,按钮的代码就简单多了:
下载按钮:
procedureTForm1.Button1Click(Sender:TObject);
var
aURL,aFile:string;
begin
aURL:=ComboBox1.Text;//下载地址,例如"http://www.2ccc.com/update/demo.exe";
aFile:=GetURLFileName(aURL);//得到文件名,例如"demo.exe"
ifFileExists(aFile)then
begin
caseMessageDlg('文件已经存在,是否续传?',mtConfirmation,mbYesNoCancel,0)of
mrYes:MyDownLoad(aURL,aFile,True);//续传
mrNo:MyDownLoad(aURL,aFile,False);//覆盖
mrCancel:Exit;//取消
end;
endelseMyDownLoad(aURL,aFile,False);//建立新文件下载
end;
MessageDlg()函数弹出一个对话框让用户选择续传、覆盖还是取消下载。
中断按钮:
procedureTForm1.Button2Click(Sender:TObject);
begin
AbortTransfer:=True;
end;
前面忘了介绍,所以这里大家看不明白,AbortTransfer是我们定义的一个私有变量,在开始下载的时候将它设为False,下载的过程中随时监测这个变量,一旦变为True就利用IdHTTP的Disconnect和IdFTP1的Abort方法中断下载,如果没有下载完就中断,那程序的目录中就会有一个下载不完整的程序或者其他东西,下次再下载的时候我们就可以选择续传来完成剩下的下载过程。
procedureTForm1.IdHTTP1WorkBegin(Sender:TObject;AWorkMode:TWorkMode;
constAWorkCountMax:Integer);
begin
AbortTransfer:=False;
……
end;
在IdHTTP1和IdFTP的OnWorkBegin事件我们就将AbortTransfer设置为False了,在他们的Work事件中,我们检测AbortTransfer变量来完成是否中断的操作。
procedureTForm1.IdHTTP1Work(Sender:TObject;AWorkMode:TWorkMode;
constAWorkCount:Integer);
begin
ifAbortTransferthen
begin//中断下载
IdHTTP1.Disconnect;
IdFTP1.Abort;
end;
ProgressBar1.Position:=AWorkCount;
Application.ProcessMessages;
end;
(3)最后是连接状态等信息的代码:
在IdHTTP和IdFTP的OnStatus事件写入:
procedureTForm1.IdHTTP1Status(ASender:TObject;constAStatus:TIdStatus;
constAStatusText:string);
begin
ListBox1.ItemIndex:=ListBox1.Items.Add(AStatusText);
end;
因为IdHTTP和IdFTP在OnWork、OnStatus等事件上执行的代码都是一样的,所以我们只用写其中一个的代码,然后另外一个选择相同的事件就OK了。

图8.3.4
3.全部代码写完收工,F9运行一下看看效果,是不是能断点续传。
【程序小结】
本程序主要的功能由IdHTTP和IdFTP组件完成,主要掌握他们的Get过程实现断点续传的方法以及字符串的分析分解方法,这里我们同样使用了流格式,不过这次不是内存流而是文件流。通过本例,读者应该初步掌握调试程序时断点的使用,事件代码的共用等。
【作者后话】
在写完这篇文章不久,作者偶然间察看了Indy系列组件的帮助,发现一个封装了分析URL结构的类TIdURI,在IdURI单元,这个类可以很轻松的将我们上面的GetFTPParams()函数的功能实现,例如:
var
URI:TIdURI;
begin
URI:=TIdURI.Create(aURL);//建立
try
sProtocol:=URI.Protocol;//协议
sHost:=URI.Host;//主机
//……等等都可以通过URI的属性得到
finally
URI.Free;
end;
end;
使用此类我们的程序可以变得更简单,如何修改就留给读者自己去完善吧


分享到:
评论

相关推荐

    Http/FTP多线程断点续传下载组件

    点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持...

    delphi断点续传http下载源码

    本文将深入探讨Delphi中实现断点续传HTTP下载的源码知识,以及如何处理非80端口的HTTP下载。 首先,理解断点续传的基本原理是至关重要的。断点续传技术通过在下载过程中记录当前已下载的数据位置(即“断点”),...

    delphi 多线程断点续传支持超大文件2G以上传输带源码

    本项目聚焦于利用Delphi实现多线程技术,以支持断点续传功能,从而高效地传输超大文件。 首先,多线程是并发处理的关键,它允许程序同时执行多个任务,提高系统资源的利用率。在文件传输中,多线程可以将大文件分割...

    断点续传的DELPHI实现..rar

    本压缩包文件“断点续传的DELPHI实现..rar”可能包含了实现这一功能的相关代码示例,虽然无法直接查看具体内容,但根据题目要求,我可以提供一个基于DELPHI实现断点续传的基本框架和涉及的关键知识点。 首先,我们...

    Ftp断点续传源码.rar

    FTP断点续传是网络上传下载技术中的一个重要概念,它允许用户在中断连接后从上次停止的地方继续传输文件,极大地提高了文件传输的效率和可靠性。本压缩包“Ftp断点续传源码.rar”提供了使用Delphi编程语言实现FTP...

    DELPHI断点续传.rar

    在Delphi中,你可以使用TFile或TFileStream类来读写文件,获取或设置文件指针的位置,从而实现续传。 其次,网络通信是关键。Delphi提供了 Indy 和 Synapse 等网络库,它们提供了HTTP、FTP等协议的支持。在实现断点...

    点量Http/FTP多线程断点续传下载组件DLL

    点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持...

    Delphi 实现FTP连接及上传下载

    在IT行业中,Delphi是一种基于Object Pascal编程语言的集成开发环境(IDE),广泛用于创建桌面应用...对于U_FTP这样的项目文件,通常包含示例代码、配置文件或其他辅助资源,可以帮助开发者更好地理解和实现FTP操作。

    FTP.rar_delphi_delphi ftp_ftp_ftp delphi_续传

    标题中的"FTP.rar_delphi_delphi ftp_ftp_ftp delphi_续传"表明这是一个关于使用Delphi编程语言实现FTP(文件传输协议)功能的项目,特别提到了“续传”功能,意味着它可能支持断点续传,即在上传或下载过程中因网络...

    文件断点续传

    断点续传的实现基于文件分块和位置记录。在传输过程中,文件被分割成若干小块,每一块都有其唯一的标识或顺序号。当传输中断时,系统会记录下已成功传输的块的信息,包括块的位置、大小和传输状态。当重新开始传输...

    DELPHI FTP下载

    在压缩包内的"FtpProcess (20090902)"可能是这个FTP下载程序的源代码文件,其中可能包含了FTP连接、文件传输、断点续传等功能的实现。开发者可以通过阅读和分析这些源代码,了解如何在Delphi中实现FTP协议,包括但不...

    Delphi7实现FTP

    虽然TIdFTP组件本身不直接支持断点续传,但开发者可以通过记录已上传或下载的文件部分,然后在下次连接时跳过已完成的部分,实现类似的功能。 通过熟练掌握这些基本操作,你可以用Delphi 7高效地实现FTP文件传输...

    FTP上传下载(Delphi7).zip

    在Delphi7中,通过TIdFTP组件可以方便地实现FTP上传和下载功能。TIdFTP组件提供了连接、登录、改变工作目录、上传文件(`Put`方法)、下载文件(`Get`方法)以及断点续传(`Append`方法配合`Resume`属性)等操作。...

    FTP Delphi

    在Delphi中,我们可以利用内置的TIdFTP组件来实现FTP的连接、上传、下载、删除等基本功能,以及其他高级特性如断点续传、目录操作等。 首先,了解TIdFTP组件。TIdFTP是Indy库的一部分,Indy是一个用于网络通信的...

    delphi ftp基础

    delphi ftp基础 入门级 非常详细 包括创建文件夹 创建文件 检索文件 上传下载文件 支持断点续传等 delphi ftp基础 入门级 非常详细 包括创建文件夹 创建文件 检索文件 上传下载文件 支持断点续传等

    FTP下载同步工具(delphi源码)

    因此,FTP同步工具需要具备良好的错误处理机制,如自动重连、断点续传和错误恢复等。 5. 用户界面:Delphi提供丰富的组件库,允许开发者创建美观且易用的用户界面。FTP同步工具可能包含登录界面、文件列表、设置...

    Delphi使用TIdFtp控件实现FTP协议.doc

    而 FTP(File Transfer Protocol,文件传输协议)作为一种历史悠久且成熟的协议,能够高效稳定地完成大文件的上传下载任务,并支持断点续传功能。本文将详细介绍如何在 Delphi 中利用 TIdFtp 控件实现基于 FTP 的...

    Delphi FTP源程序

    通过学习和理解这个Delphi FTP源程序,开发者可以了解到如何在实际项目中集成FTP功能,包括文件的上传、下载,以及如何扩展实现断点续传。这对于构建网络相关的应用程序,尤其是那些需要进行文件交换的应用来说,是...

    Delphi客户端通过FTP服务器上传或下载文件或图片方法

    此外,为了提高用户体验,还可以添加一些额外的功能,如进度条显示上传或下载进度、支持断点续传等功能。对于开发者来说,熟悉并掌握这些基本操作是非常重要的,这有助于构建更加稳定和高效的文件传输系统。

    一个用FTP传输文件的例子(delphi)

    6. **错误处理和断点续传**:在进行FTP操作时,应处理可能出现的错误,例如网络中断、文件不存在等。TIdFTP组件提供了错误处理机制。另外,有些FTP服务器支持断点续传,允许在传输中断后从上次的位置继续,这通常...

Global site tag (gtag.js) - Google Analytics