Delphi中轻松实现TIdFtp的断点续传


本文整理自网络,侵删。

 1、“先获取服务器文件的大小,把本地文件流指向该位置,然后用Put方法并把Append设置为true。” - 我估计他压根就没实验过,文件还是会直接整个附加在上次传的后面的。本地FileStream的位置指定不起任何作用。 
 2、“设法修改idFTP单元,让它支持断点续传。” - 我觉得没把握,切勿轻易修改VCL的自带单元,尤其是暂处于初心者阶段的朋友。不过就算改出来了,以后重装DELPHI后,还得再次覆盖该单元。且对于公司项目来说,如果接你手的人不知道你改了VCL源代码,那后果是很严重的。所以,如果有其它更好的方法,我建议最好不这样做。
 3、“直接用FTP指令进行交互。” - 除非你很熟悉FTP协议了,我觉得一般人可能不会这样的方法。
 转入正题,其实我们只要结合一个MemoryStream,就可以轻松实现断点续传了。代码如下:

//www.delphitop.com 收集整理
procedure TFtpThread.Resume(AFileName: string);
const
 SEND_BUFFER = 1048576;  // 一次提交1M的东西
var
 AFileStream: TFileStream;
 AMemStream: TMemoryStream;
 sFileName: string;
begin
 sFileName := ExtractFileName(AFileName);
 AFileStream := TFileStream.Create(AFileName, fmOpenRead);
 try
  // 连接服务器,假设帐号密码那些已经设好了
  FIdFtp.Connect;
  // 获取断点
  AFileStream.Seek(FIdFtp.Size(sFileName), soFromBeginning);
  // 开始断点续传
  AMemoryStream := TMemoryStream.Create;
  try
   while (not Terminated) and (AFileStream.Position < AFileStream.Size) do
   begin
    AMemStream.Clear;
    AMemStream.CopyFrom(AFileStream, Min(SEND_BUFFER, AFileStream.Size - AFileStream.Position));
    FIdFtp.Put(AMemStream, sFileName, true);
   end;
   AMemStream.Free;
  except
   AMemStream.Free;
   raise;
  end;
  // 判断是否上传完毕
  if AFileStream.Position = AFileStream.Size then
   ShowMessage('上传完毕!')
  else
   ShowMessage('下次记得继续续传哦~');
  AFileStream.Free;
 except
  AFileStream.Free;
  ShowMessage('出错啦... - -');
 end;
end;

 代码很简单,不说了,主要就是把续传部分分块读进一个临时的MemoryStream中。这样做不但让Put方法中的Append参数真正发挥其作用,而且线程停止的时候,也可以随时把上传停下来。注意千万不要把续传部分一次过读进MemoryStream里,当你续传一个1G的文件时,可能你立刻就会后悔的哦。

相关阅读 >>

Delphi读取android设备联系人.Delphixe6中编译通过

Delphi百度云服务平台获取token

Delphi 让程序只运行1次

Delphi屏蔽指定热键

Delphi键盘按键伪码多类型

Delphi无dll穿墙下载者

Delphi xe 遍历指定数据库,清空各表记录

Delphi读取webbrowse中的图片显示在image中

Delphi 多重循环

Delphi分享pos函数。(比fastpos还要快)

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...