[Delphi] 델파이 FTP 서버 이미지 전송

    728x90

    안녕하세요

    로로봉입니다 : )

    개발을 하다보면 FTP 서버에 파일을 저장해야하는 경우가 종종 있습니다.

    이번에는 델파이를 사용하여 모바일 앱에서 FTP 서버로 이미지 파일을 전송하는 법을 알아보도록 하겠습니다.


    1) 통신 데이터 구조

    우선 모바일 앱을 서버의 데이터 스넵 서비스와 연결하여 구현하였습니다.

    모바일에서 데이터 스넵으로 바로 이미지 파일을 전송하면 좋겠는데, 여러 시도 끝에 좀 어렵다는 결론이 나왔습니다.

    방법을 알고 계신 분이 있으시면 댓글 달아주셔도 좋겠네요. : )

    이미지 파일을 데이터스넵 구조로는 Stream 데이터를 넘기기 어려워 TCP/IP 서버를 이용하여 전송해보았습니다.

     

    데이터스넵 서비스 내부에 TCP/IP 서버를 두어 아래와 같이 통신하였습니다.

    [ 그림 1 : 통신 구조 ]

    클라이언트에서 이미지 전송은 아래와 같이 구현하였습니다.

    procedure
    var
       memTmp : TMemoryStream;
    
       usSend : string;
       tcpClient : TIdTCPClient;
    begin
       tcpClient := TIdTCPClient.Creaate(nil);
       memTmp := TMemoryStream.Create;
       try
          tcpClient.Host := ‘서비스 아이피’;
          tcpClient.Port := 서비스 포트;
          tcpClient.ConnectTimeout := 1500;
          tcpClient.Connect;
    
          tcpClient.Socket.DefStringEncoding := IndyTextEncoding_UTF8;
     
          memTmp.Clear;
          Image.Bitmap.SaveToStream(memTmp);
      
          usSend := ‘{“FILENAME”:”Test.png”,’ +
                    ‘”SIZE”:”’ + IntToStr(memTem.Size) + ‘”}’;
          tcpClient.Socket.WriteLn(usSend);
    
          tcpClient.Socket.Write(memTmp);
       finally
          tcpClient.Disconnect;
          FreeAndNil(tcpClient);
          FreeAndNil(memTmp);
       end;
    end;

    이미지를 TMemoryStream에 저장하고 JSON String으로 이미지 정보를 먼저 보낸 후 Stream을 전송하도록 하였습니다.

    TCP/IP 서버에서는 아래와 같이 Execute 이벤트에서 JSON을 받아들여서 Stream 사이즈를 확인 후 Stream을 읽어들이면 됩니다.

    procedure Service.TCPServerExecute(AContext: TIdContext);
    var
       FileName : string;
       Recv : string;
       iSize : Int64;
       memTmp : TMemoryStream;
    begin
       AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8;
       
       Recv := Trim(AContext.Connection.IOHandler.ReadLn);
       if Recv <> ‘’ then
       begin
          FileName := JSONConvert(Recv,’FILENAME’);
          iSize := StrToInt(JSONConvert(Recv,’SIZE’));
    
          memTmp := TMemoryStream.Create;
          try
             AContext.Connection.IOHandler.ReadStream(memTmp, iSize, False);  memTmp.SaveToFile(ExtractFilePath(ParamStr(0))+'Images\'+Filename);
          finally
             FreeAndNil(memTmp);
          end;
       end;
    end;


     


    2) FTP 서버 폴더 검색 및 생성

     FTP 서버에 접속하여 사용하기 위해서 Indy 컴포넌트를 사용하였습니다.

    아래와 같이 TIdFTP 변수를 사용하여 FTP 서버에 접속할 수 있습니다.

    procedure
    var
       usFilePath : string;
       FTP : TIdFTP;
       sList : TStringList;
       index : Integer;
    begin
       FTP := TIdFTP.Create(nil);
       sList := TStringList.Create;
       try
          FTP.Host := ‘서버 아이피’;
          FTP.Port := 21;
          FTP.Passive := True;
          FTP.Username := ‘아이디’;
          FTP.Password := ‘비밀번호’;
          FTP.Connect;
    
          // 디렉토리 리스트 불러오기
          FTP.List(sList);
    
          // 디렉토리 존재 여부 확인 후 없으면 생성
          if Pos(‘Images’, sList.Text) = 0 then
             FTP.MakeDir(‘Images’);
    
          // 디렉토리로 경로 변경
          FTP.ChangeDir(‘Images’);
       finally
          FTP.Disconnect;
          FreeAndNil(FTP);
       end;
    end;

    3) FTP 파일 전송

     FTP 파일 전송은 아래와 같이 Put 명령어를 사용하여 전송하면 됩니다.

    디렉토리를 확인하고 이동한 후에 아래 명령어를 이용하여 파일을 전송할 수 있습니다.

    // Put(전송할 파일, FTP 서버에 저장할 파일명)
    
    FTP.Put(ExtractFilePath(ParamStr(0)) + 'Images\' + Filename, Filename);

     

    좋아요 ♥ + 구독 부탁드립니다. : )

    728x90
    반응형

    댓글