Конференция "Сети" » Отправка и приём файлов в FTP сервер [D7, WinXP]
 
  • Xmen (15.11.11 08:25) [0]
    Привет мастерам!
    Нужна сделать прогу для отправки и приёму файлов в FTP сервер. Нужно сделать так чтобы по таймеру обновлял файлы(отправка/приём). Этакое маленькое служба почты. Нашел пример и по примеру сделал процедуру
    отправка
    procedure FTPUpload();
    var IdFTP:TIdFtp;
       dn:integer;
       F: TSearchRec;
    begin
     try
       IdFTP:=TIdFTP.Create(nil);
       if IdFTP.Connected then
         begin
          IdFTP.Abort;
          IdFTP.Quit;
         end;
       IdFTP.Username := UserName;
       IdFTP.Password := UserPass;
       IdFTP.Host := FTPIp;
       try
          IdFTP.Connect;
          if IdFTP.Connected then
            begin
             IdFTP.ChangeDir('/Send');
             chdir('D:\Send\');
             dn := FindFirst('*.*',faArchive,F);
             while dn = 0 do
               begin
                 IdFTP.Put('D:\Send\'+f.name,f.name);
                 dn := FindNext(F);
               end;
             IdFTP.Quit;
            end;
          ShowMessage('Загрузка завершена.');  
       except
          ShowMessage('Ошибка отправки.');
       end;
     finally
       IdFTP.Free;
     end;
    end;



    приём
    procedure FTPDownload();
    var IdFTP:TIdFtp;
       dn:integer;
       F: TSearchRec;
    begin
     try
       IdFTP:=TIdFTP.Create(nil);
       if IdFTP.Connected then
        begin
          IdFTP.Abort;
          IdFTP.Quit;
        end;
       IdFTP.Username := UserName;
       IdFTP.Password := UserPass;
       IdFTP.Host := FTPIp;
       try
          IdFTP.Connect;
          if IdFTP.Connected then
            begin
             IdFTP.ChangeDir('/Recv');
             //chdir('D:\Recv\');
             dn := FindFirst('*.*',faArchive,F);
             while dn = 0 do
               begin
                 IdFTP.Get(f.name, 'D:\Recv\'+f.name);
                 dn := FindNext(F);
               end;
             IdFTP.Quit;
            end;
          ShowMessage('Прём файлов завершен.');
       except
          ShowMessage('Ошибка приёма.');
       end;
     finally
         IdFTP.Free;
     end;
    end;



    Довнлоад каталога не получается  по имени файла нормально получается.  
    И как нужно правильно организовать работу с FTP сервером
  • Сергей М. © (15.11.11 09:06) [1]
    Либо проблем нет либо они есть и вполне конкретные.
    А "не получается" - в программировании нет такого слова)
  • Anatoly Podgoretsky © (15.11.11 09:56) [2]
    > Xmen  (15.11.2011 08:25:00)  [0]

    Я в растерянности, то получается, то нет

    > не получается  по имени файла нормально получается.
  • Xmen (15.11.11 10:18) [3]
    Изменяюсь за то что конкретно не описал задачу и проблему.
    У меня получается Upload каталога а Download каталога не работает. Одного файла скачать получился по имени файла  а несколько файлов не получился

    dn := FindFirst('*.*',faArchive,F);
            while dn = 0 do
              begin
                IdFTP.Get(f.name, 'D:\Recv\'+f.name);
                dn := FindNext(F);
              end;


    не работает.  IdFTP.Get('1.doc', 'D:\Recv\1.doc'); работает.
    У меня обработка каталога не получился.
    И вопрос я ранше не работал с FTP, как работает докачка файла.
  • Anatoly Podgoretsky © (15.11.11 11:23) [4]
    > Xmen  (15.11.2011 10:18:03)  [3]

    Странно однако, в FindFirst *.*, а в Get f.name

    Спрашивается зачем же нужен FindFirst если оно не используется, кроме того
    неужели ты думаешь что в папке может быть более одного файла с одинаковым
    имением, ты просто оптимист.

    Да и справка говорит, что такого прототива вызова нет. Второй параметр
    должен быть потоком
  • clickmaker © (15.11.11 11:51) [5]
    > Download каталога не работает

    FindFirst вообще-то функция для локальной ФС. Какое отношение она к download имеет?
  • Anatoly Podgoretsky © (15.11.11 12:22) [6]
    То то у меня справка нашла, а надо для Инди, а там такой функции нет
  • Плохиш © (15.11.11 12:46) [7]

    > Xmen   (15.11.11 10:18) [3]
    >
    > Изменяюсь за то что конкретно не описал задачу и проблему.
    >
    > У меня получается Upload каталога а Download каталога не
    > работает.

    Так как он может работать? Файлы у тебя лежат на сервере, а список ты ищеш локально.
    TidFtp.List + F1
  • Xmen (15.11.11 13:05) [8]
    Вот поэтому и спрашивал
    TidFtp.List нашел
    и пример автор которого Куликов Алексей после изменения код такой

    procedure Download;
    var
     IdFTP:TIdFtp;
     Path: string;
     FileList :  TStringList;
     jj: Integer;
    begin
     IdFTP:=TIdFTP.Create(nil);
       if IdFTP.Connected then
        begin
          IdFTP.Abort;
          IdFTP.Quit;
        end;
     IdFTP.Username := UserName;
     IdFTP.Password := UserPass;
     IdFTP.Host := FTPIp;
     Path := 'D:\Recv\';
     try
       IdFTP.Connect();
       idFTP.ChangeDir('/Recv');
       try
         FileList := TStringList.Create;
         idFTP.List(FileList,'*.*',False);
         for jj := 0 to FileList.Count-1 do
         begin
           try
             idFTP.Get(FileList[jj], Path + FileList[jj], True);
           except
             on E: Exception do
               ShowMessage(Format('Ошибка скачивания',[FileList[jj], E.ClassName, E.Message]));
           end;
         end;
       finally
         FreeAndNil(FileList);
       end;

       IdFTP.Disconnect
     except
       on E: Exception do
         showmessage('Error!'#13#10+E.Message);
     end;


    И как организовать докачку  файла.
  • Anatoly Podgoretsky © (15.11.11 13:18) [9]
    В протоколе команды rest/reget

    В инди смотри сначала resime/restpos
  • Xmen (15.11.11 14:38) [10]
    IdFTP1.ResumeSupported Это?
  • Anatoly Podgoretsky © (15.11.11 14:48) [11]
    > Xmen  (15.11.2011 14:38:10)  [10]

    Там в справке все хорошо описано.
  • Xmen (15.11.11 15:32) [12]
    изменил код на это
    idFTP.Get(FileList[jj], Path + FileList[jj], False, True);
    Теперь правильно?
  • Xmen (15.11.11 16:57) [13]
    Вот другая ошибка при Upload е получил такую ошибку. Файл был где то 50 мегабайтов. Загрузил 9 мегабайтов и получил ошибку. Докачка не получился
    Socket Error #10054 Connection reset by per
  • Xmen (16.11.11 07:54) [14]
    Воспользовался примером
     Demo Name:  FTP Client Demo
     Created By: Doychin Bondzhev
             On: 27/10/2002
     Notes:
       FTP Client Demo

    и он тоже вернул ошибку
    Socket Error #10054 Connection reset by per
    Где может быт ошибка, как можно решит проблему?
  • Сергей М. © (16.11.11 10:10) [15]
    Возьми на вооружение модуль ftpsend из состава Synapse и не мучайся
  • Anatoly Podgoretsky © (16.11.11 10:33) [16]
    > Xmen  (16.11.2011 07:54:14)  [14]

    Connection reset by peer это не ошибка, а нормальная работа протокола.
  • Xmen (16.11.11 11:18) [17]

    > Anatoly Podgoretsky ©   (16.11.11 10:33) [16]
    > > Xmen  (16.11.2011 07:54:14)  [14]Connection reset by peer
    > это не ошибка, а нормальная работа протокола.

    Это я понял вот как мне сделать так чтобы снова соединяется с сервером.
    IdFTP1.Disconnect;
    IdFTP1.Socket.Close;
    IdFTP1.Connect;
    Не получился дала ошибку.

    > Сергей М. ©   (16.11.11 10:10) [15]
    > Возьми на вооружение модуль ftpsend из состава Synapse и
    > не мучайся

    Это отдельная компонента?
    И вопрос как правильно организовать работу с FTP сервером. Я так понял что могут быть обрыв связи, докачка файла итд.
    Есть ли другой компонент лучший чем Indy, простой в использование а то я по гуглу нетак много нашел. Indy in Depth - не про этот компонент :)
  • Сергей М. © (16.11.11 11:39) [18]

    > Это отдельная компонента?


    Это вообще не "компонента".
    В юните ftpsend.pas есть довольно подробные комментарии по использованию класса TFtpSend
  • clickmaker © (16.11.11 12:14) [19]
    Indy тоже вполне нормально может работать.
    Но у разных фтп-серваков есть свои нюансы. Н-р, кто-то разрешает только пассивный режим и т.п.
 
Конференция "Сети" » Отправка и приём файлов в FTP сервер [D7, WinXP]
Есть новые Нет новых   [134435   +13][b:0][p:0.003]