Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > FTP и Передача файла


Автор: Угрюмый 23.9.2008, 06:08
Столкнулся с проблемой при написании функционалдности FTP-клиента в программе. Понадобилось написать, так как нужно было взаимодейтсвие с HTTP-прокси.

Наследую от TIdTCPConnection. Вроде все нормально. И коннектится и получает список файлов ... Но при отправке данных на ftp получается файл с двумя лишними байтами впереди (#10#13). Никак не могу понять, почему. Модет кто подскажет?

Приведу косок кода, ответственного за отправку файла.

Код

  Procedure PutData (AItem : T_Item; AFile : string);
  var
    l_Str : string;
    l_SourceStream: TFileStream;
    l_Stream: TIdStreamVCL;
    i : integer;
    l_Byte : TIdBytes;
  begin

    IdTCP_2.Connect;

    IdTCP_2.SendCmd('CONNECT 217.116.145.206:'+IntToStr(l_AnswerPort)+' HTTP/1.0'+
      CRLF+'Proxy-authorization: Basic '+l_UserPass+CRLF+CRLF, 200);
    IdTCP_2.IOHandler.ReadLn; 

    IdTCP_1.SendCmd('CWD '+AItem.OPS+CRLF, [250]);

    l_SourceStream := TFileStream.Create(AFile, fmOpenRead or fmShareDenyNone);
    try
      l_Stream := TIdStreamVCL.Create(l_SourceStream);

      IdTCP_1.SendCmd('STOR '+ExtractFileName(AFile), [150]);


//      IdTCP_2.IOHandler.WriteFile(AFile); 

      IdTCP_2.IOHandler.Write(l_Stream);
    finally
      FreeAndNil(l_Stream);
      FreeAndNil(l_SourceStream);
    end;

    IdTCP_2.Disconnect;

    ProgressBar.StepIt;
    Application.ProcessMessages;

  end;



Даже если ничего не отправлять во второй сокет (IdTCP_2), то создается файл с двумя байтами - #10#13.

Автор: Угрюмый 23.9.2008, 07:01
Дело в проксе ... похоже. Ибо меняю другой прокси (прозрачный), в принципе ничего переписывать не нужно, лишь ip-адрес поменял в настройках - и все рнормально - размер файла такой какой нужен, ничего лишнего.

Проксятники отличаются тем, что первый HTTP со squid'ом, а второй прозрачный с UserGate'ом. Может при подключении к проксятнику нужно что-то прописывать, дабы он отсебятину не пихал при передачи данных на ftp? Причем пихает в начало и только два байта. Пробовал по символьно передовать поток ... передался вместе с лишними двумя байтами в начале файла.  smile 

Помогите ...  smile 

Да ... и еще, к примеру, Totol Commander'у плевать с каким прокси работать, он все делает как надо. Значит это все-таки я с данным проксятником общаюсь не правильно ... ждет он от меня наверно что-то.  smile 

Автор: Угрюмый 23.9.2008, 09:55
Если кому интересно, то фишка в подключении.

Для первого (IdTCP_1), которого потом переводим в пассивный режим нужно чтобы в строке подключения была пустая строка.

IdTCP_1.SendCmd('CONNECT 217.116.145.206:'+IntToStr(l_AnswerPort)+' HTTP/1.0'+
      CRLF+'Proxy-authorization: Basic '+l_UserPass+CRLF+CRLF, 200);

А у второго (IdTCP_2), через который мы передаем файл

IdTCP_2.SendCmd('CONNECT 217.116.145.206:'+IntToStr(l_AnswerPort)+' HTTP/1.0'+
      CRLF+'Proxy-authorization: Basic '+l_UserPass+CRLF, 200);

Не нужна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)