轻松实现TIdFtp的断点续传(上传)

轻松实现TIdFtp的断点续传(上传)
 关于这个控件的断点续传(上传)的实现方法,网上现在主要有几种说法,我觉得多是不对或者不够好的(可能是我还没找到好用的吧,都知道中国的网站90%是COPY来COPY去的,找多了也累了),部分列举如下:

 1、“先获取服务器文件的大小,把本地文件流指向该位置,然后用Put方法并把Append设置为true。” - 我估计他压根就没实验过,文件还是会直接整个附加在上次传的后面的。本地FileStream的位置指定不起任何作用。

 2、“设法修改idFTP单元,让它支持断点续传。” - 我觉得没把握,切勿轻易修改VCL的自带单元,尤其是暂处于初心者阶段的朋友。不过就算改出来了,以后重装DELPHI后,还得再次覆盖该单元。且对于公司项目来说,如果接你手的人不知道你改了VCL源代码,那后果是很严重的。所以,如果有其它更好的方法,我建议最好不这样做。

 3、“直接用FTP指令进行交互。” - 除非你很熟悉FTP协议了,我觉得一般人可能不会这样的方法。

 转入正题,其实我们只要结合一个MemoryStream,就可以轻松实现断点续传了。代码如下:

  1. procedure TFtpThread.Resume(AFileName: string);
  2. const
  3.  SEND_BUFFER = 1048576;  // 一次提交1M的东西
  4. var
  5.  AFileStream: TFileStream;
  6.  AMemStream: TMemoryStream;
  7.  sFileName: string;
  8. begin
  9.  sFileName := ExtractFileName(AFileName);
  10.  AFileStream := TFileStream.Create(AFileName, fmOpenRead);
  11.  try
  12.   // 连接服务器,假设帐号密码那些已经设好了
  13.   FIdFtp.Connect;
  14.   // 获取断点
  15.   AFileStream.Seek(FIdFtp.Size(sFileName), soFromBeginning);
  16.   // 开始断点续传
  17.   AMemoryStream := TMemoryStream.Create;
  18.   try
  19.    while (not Terminated) and (AFileStream.Position < AFileStream.Size) do
  20.    begin
  21.     AMemStream.Clear;
  22.     AMemStream.CopyFrom(AFileStream, Min(SEND_BUFFER, AFileStream.Size - AFileStream.Position));
  23.     FIdFtp.Put(AMemStream, sFileName, true);
  24.    end;
  25.    AMemStream.Free;
  26.   except
  27.    AMemStream.Free;
  28.    raise;
  29.   end;
  30.   // 判断是否上传完毕
  31.   if AFileStream.Position = AFileStream.Size then
  32.    ShowMessage('上传完毕!')
  33.   else
  34.    ShowMessage('下次记得继续续传哦~');
  35.   AFileStream.Free;
  36.  except
  37.   AFileStream.Free;
  38.   ShowMessage('出错啦... - -');
  39.  end;
  40. end;

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

 

文章来自:http://harryfin.spaces.live.com/Blog/cns!31E57C5D97ECDF5!403.entry

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值