bianbian coding life

便便代码人生: 关注技术, 翻译文档, 偶尔动动手

[原]关于Indy组件(Delphi)实现FTP上传断点续传的方法 (upload resume)

Posted by bianbian on 2008-01-15 09:00

本文Tags: , , ,

Indy不仅支持下载断点续传,也支持上载断点续传,而且不需要对Indy做出改造。
在Blues的blog,他提到可以“通过IDFTP得到服务端已经上传的部分的SIZE,然后通过文件流在本地建立剩余部分的临时文件,然后以APPEND方式上传,传完后删除临时文件,达到上传断点续传的效果”。原文在此:DELPHI ftp 上传断点续传的实现
我再仔细看了Indy的源码,发现不需要临时文件。可以对Blues的方法作出重大改进:
Put()方法第一个参数可以是TStream(实际上,如果是文件名的话Indy会建立Stream,然后再调用Stream的Put方法)。而且如果Append设为True的话,Indy不会去动Stream的Position:

  1. procedure TIdFTP.Put(const ASource: TStream; const ADestFile: string = '';
  2.  const AAppend: boolean = false);
  3. ...
  4. procedure TIdTCPConnection.WriteStream(AStream: TStream; const AAll: boolean = true;
  5.   const AWriteByteCount: Boolean = False; const ASize: Integer = 0);
  6. ...
  7.   if AAll then begin //bianbian注:如果Append,AAll是false
  8.     AStream.Position := 0;
  9.   end;
  10.   // This is copied to a local var because accessing .Size is very inefficient
  11.   if ASize = 0 then begin
  12.     LStreamEnd := AStream.Size;
  13.   end else begin
  14.     LStreamEnd := ASize + AStream.Position;
  15.   end;
  16.   LSize := LStreamEnd - AStream.Position;
  17. ...

也就是说,先把原文件的Stream Seek到Size位置,丢给Indy即可,实现也很简单:

  1. var
  2.   fs: TFileStream;
  3. ...
  4.   fs := TFileStream.Create(FullFileName, fmOpenRead or fmShareDenyWrite);
  5.   fs.Seek(size, 0); //偏移
  6.   FTP.Put(fs, ExtractFileName(FullFileName), True);
  7.   fs.Free;
标签: , , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

One Response to “[原]关于Indy组件(Delphi)实现FTP上传断点续传的方法 (upload resume)”

  1. good Says:

    感谢博主!果然能断点续传!

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

(required)