•  

ГлавнаяIndyЧастые вопросы по Indy → Подскажите как организовать FTP докачку файлов

Создано: 17.05.2014 3:34:04 · Исправлено: 17.05.2014 3:34:04 · Прочтений: 1483

Подскажите как организовать FTP докачку файлов. Проблемма в том что решил писать фтп клиент средствами компонента nmftp так как в отличии от indy компонета idftp он поддерживает докачку, потом оказалось что nmftp имеет кучу багов, иногда подвисает на какойнибудь команде, не вызывая никаких исключений... Как организовать докачку средставми idftp? На множестве сайтов по delphi написано что можно послать команду rest серверу, но как это сделать я незнаю... Помогите!!!
Читайте FTP протокол, это про можно послать команду rest серверу, но как это сделать я незнаю
Надо понимать, что любые компоненты надо правильно использовать. Инди вполне себе стабильны в отличие от NM. Докачку поддерживают далеко не все FTP сервера (очень малая часть), т.к. команда REST не входит в список обязательных
>>> так как в отличии от indy компонета idftp он поддерживает докачку
Очень даже поддерживает. Для кого в .Put и .Get есть параметры Append и Resume?
Нашёл у себя старенькую функции скачивания файла с авторестартом закачки при ошибках.
Попробуйте, может пригодится:

...
  Interrupted: Boolean;
  BytesTransferred: Int64;
  BytesToTransfer: Int64;
  AverageSpeed: Extended;

...

function TfmMain.DownloadFile(const RemoteFile, LocalFile: string; aResume: Boolean): Boolean;
var
  EndLongOper: Boolean;
  DoRetry: Boolean;

  procedure RestartOperation;
  begin
    try
      ClearFTPHandlers;
      btAbort.Enabled := False;
      try
        IdFTP.Abort;
      except
        on E: Exception do ;
      end;
      Application.ProcessMessages;
      IdFTP.Disconnect;
      Application.ProcessMessages;
      BytesTransferred := GetSizeOfFile(LocalFile);
      aResume := True;
      DoRetry := True;
      lbStatus.Caption := Установка соединения с сервером...;
      Application.ProcessMessages;
      Sleep(100);
      IdFTP.Connect(True, 5000);
    finally
      SetupFTPHandlers;
    end;
    btAbort.Enabled := True;
  end;

begin
  Result := True;
  Application.ProcessMessages;
  if btAbort.Visible then
  begin
    btAbort.Tag := Ord(btAbort.Enabled);
    btAbort.Enabled := True;
    EndLongOper := False;
  end
  else
  begin
    btAbort.Tag := Ord(btAbort.Enabled);
    EndLongOper := True;
    BeginLongOperation(True);
  end;
  IdFTP.CurrentTransferMode := dmDeflate;
  try
    spProgress.Position := 0;
    spProgress.Tag := 0;
    ClearSubInfo;
    IdFTP.TransferType := ftBinary;
    BytesToTransfer := IdFTPSize(RemoteFile);
    if BytesToTransfer <= 0 then
    begin
      TFileStream.Create(LocalFile, fmCreate, fmShareExclusive).Free;
      Exit;
    end;
    BytesTransferred := 0;
    if (not aResume) and FileExists(LocalFile) then
      DeleteFile(LocalFile)
    else
      if FileExists(LocalFile) then
        BytesTransferred := GetSizeOfFile(LocalFile);
    SetupFTPHandlers;
    Interrupted := False;
    repeat
      lbStatus.Caption := Скачивание  + RemoteFile +  ->  + LocalFile + ;
      DoRetry := False;
      Application.ProcessMessages;
      try
        IdFTP.Get(RemoteFile, LocalFile, not aResume, aResume);
      except
        on E: EIdConnClosedGracefully do
        try
          RestartOperation;
        except
          on E: Exception do
          begin
            Disconnect;
            raise;
          end;
        end;
        on E: EIdSocketError do
          case E.LastError of
            0, 10053, Id_WSAECONNRESET, Id_WSAENETRESET, Id_WSAEADDRINUSE:
              try
                RestartOperation;
              except
                on E: Exception do
                begin
                  Disconnect;
                  raise;
                end;
              end;
          else
            raise;
          end;
      end;
    until not DoRetry;
    spProgress.Position := 100;
    Application.ProcessMessages;
  finally
    IdFTP.CurrentTransferMode := dmStream;
    if EndLongOper then
      EndLongOperation;
    btAbort.Enabled := Boolean(btAbort.Tag);
  end;
  Result := spProgress.Tag = 0;
  spProgress.Tag := 0;
  Application.ProcessMessages;
end;
Ребята спасибо вам запомощь все очень помогли мне все сделал все как надо :) Тема Закрыта :-)