ftp断点继传

导语:  如果ftp server支持REST指令(可以通过ftp client登入,然后输入REST 100,然后检查服务端响应),则上传或下载失败后,下次连接成功后可以从断点开始继续传输数据;

 

        下面是基于Delphi7的组件IdFTP的示例代码,比自己用指令实现方便。

        

        断点上传:

procedure TFtpThread.Execute;
var
  AFileStream: TFileStream;
  sFileName: string;
begin
  sFileName := ExtractFileName(AFileName);
  AFileStream := TFileStream.Create(AFileName, fmOpenRead);
  try
  with frmMain.IdFTP2 do
  try
    if Connected then
      Disconnect; //重新连接
    Username := 'zzzz';
    Password := 'yyyyyy';
    Host := 'xx.xx.xx.xx';
    Port := 21;
    Passive := mypassive;
    Connect;
   except
    on e: Exception do
    begin
        frmMain.StatusBar1.Panels[0].Text := '出错,异常:' + E.Message;
        frmMain.WriteLog(E.Message);
        AFileStream.Free;
        exit;
    end;
   end;
    // 获取断点
    finishedSize := frmMain.IdFTP2.Size(sFileName);
    AFileStream.Seek(finishedSize, soFromBeginning);
    // 开始断点续传
    BytesToTransfer := AFileStream.Size;
    frmMain.ProgressBar1.Max :=  BytesToTransfer div 1024;
    AFileStream.Position := finishedSize;
    
   try
    {while (not Terminated) and (AFileStream.Position < AFileStream.Size) do
    begin
      frmMain.IdFTP2.Put(AFileStream, sFileName, true);
    end;
    AMemStream.Free; }
     frmMain.IdFTP2.Put(AFileStream, sFileName, true);
   except
    on e: Exception do
    begin
        frmMain.StatusBar1.Panels[0].Text := '出错,异常:' + E.Message;
        frmMain.WriteLog(E.Message);
        AFileStream.Free;
        exit;
    end;
   end;
  // 判断是否上传完毕
  if AFileStream.Position = AFileStream.Size then
    frmMain.StatusBar1.Panels[0].Text := '上传完毕!'
  else
    frmMain.StatusBar1.Panels[0].Text := '未完成上传,点击上传继续传输!';
    AFileStream.Free;
  except
      on e: Exception do
    begin
        frmMain.StatusBar1.Panels[0].Text := '出错,异常:' + E.Message;
        frmMain.WriteLog(E.Message);
        AFileStream.Free;
        exit;
    end;
  end;
end;

 

   断点下载:

  

procedure TfrmMain.FtpDownLoad(aURL, aFile: string);
var
  tStream: TFileStream;
  sName, sPass, sHost, sPort, sDir,sFile: string;
  bResume: Boolean;
begin //ftp方式下载
  if FileExists(aFile) then //建立文件流
    tStream := TFileStream.Create(aFile, fmOpenWrite)
  else
    tStream := TFileStream.Create(aFile, fmCreate);

  GetFTPParams(aURL, sName, sPass, sHost, sPort, sDir,sFile);
  with IdFTP1 do
  try
    if Connected then
      Disconnect; //重新连接
    Username := sName;
    Password := sPass;
    Host := sHost;
    Port := StrToInt(sPort);
    Passive := mypassive;
    Connect;
   except
   on e: Exception do
   begin
        Application.MessageBox(PChar(E.Message), 'error', 16);
        WriteLog(E.Message);
        exit;
   end;
   end;
  IdFTP1.ChangeDir(sDir); //改变目录
  BytesToTransfer := IdFTP1.Size(sFile);
  ProgressBar1.Max := BytesToTransfer div 1024;
  if FileExists(aFile) then
    bResume := true
  else
     bResume := false;

  try
    if bResume then //续传
    begin
      //ProgressBar1.Position := tStream.Size div 1024;
      finishedSize := tStream.Size;
      tStream.Position := tStream.Size;
      IdFTP1.Get(sFile, tStream, True);
    end
    else begin
      IdFTP1.Get(sFile, tStream, False);
    end;
    if tStream.Position = BytesToTransfer then
    begin
      StatusBar1.Panels[0].Text := '下载完成';
    end;
  finally
    tStream.Free;
  end;
end;

//ftp://user:pwd@foolish.6600.org:2003/soft/list.mp4
procedure TfrmMain.GetFTPParams(var aURL, sName, sPass, sHost, sPort,
  sDir,sFile: String);
var
  URI: TIdURI;
begin
  URI := TIdURI.Create(aURL); //建立
  try
    sHost := URI.Host; //主机
    sPort := URI.Port;
    sName := URI.Username;
    sPass := URI.Password;
    sDir := URI.Path;
    sFile := URI.Document;
  finally
    URI.Free;
  end;
end;

 

          

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT是一种跨平台的C++库,可以方便地进行ftp断点FTP断点是指在文件输过程中,当输中断后,可以在下次输时从中断的位置输,而不需要重新输整个文件。 在QT中实现ftp断点的关键是利用Qt的QNetworkAccessManager类和QNetworkReply类。首先,我们需要使用QNetworkAccessManager类建立与FTP服务器的连接,并发送GET命令获取文件。在QNetworkReply的finished()信号槽中可以检查文件的是否已下载完整,如果未完整下载,则可以通过设置Range请求头部来实现断点。这里的Range请求头部指定了从断点位置开始的字节数到文件末尾的字节数。 接下来,我们需要获取断点位置,可以通过QFile的size()方法获取已经下载的文件大小,然后将断点位置递给FTP服务器。在Qt的QUrl的setEncodedQueryItem()方法中设置文件下载的起始位置。 等到下载完整个文件后,我们可以使用QFile类的seek()方法将文件指针移动到断点位置处,然后重新发起GET请求,续从断点位置下载文件剩余部分。在QNetworkReply的finished()信号槽中,再次检查文件是否已下载完整,如果未完整下载,则续进行断点。 通过以上步骤,我们就可以在QT中实现ftp断点功能。在实际应用中,我们还需要处理网络连接的中断、服务器断开连接等情况,以确保断点的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值