[Delphi] 웹으로 파일 전송(POST) 하는 프로그램

 

웹으로 파일 전송(POST) 하는 프로그램

예전에 홈페이지나 블로그에 파일을 전송하는
프로그램을 만든적 있었는데
그때 소스를 정리해서 올립니다.

폴더 선택
폴더 선택 다이얼로그 가 나와서 PC의 폴더를
선택하는 코드(SelectDirectory 사용)

---- 소스코드
const
    SELDIRHELP = 1000;
var
    Dir: String;
    OSVersionInfo: TOSVersionInfo;
begin
    // 폴더 선택
    // 작업 경로 설정
    Dir := CurPath;
    OSVersionInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
    GetVersionEx(OSVersionInfo);
    if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
        if SelectDirectory('폴더 찾아보기','',Dir) then begin
            if Dir[Length(Dir)] <> '\' then
                Dir := Dir + '\';
            CurPath := Dir;
            LoadFileList(CurPath);
        end;
    end
    else begin
        if SelectDirectory(Dir,[sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then begin
            if Dir[Length(Dir)] <> '\' then
                Dir := Dir + '\';
            CurPath := Dir;
            LoadFileList(CurPath);
        end;
    end;
end;
---- 소스코드 끝

선택된 폴더에서 파일 읽어 오기

폴더내의 파일 목록을 일어오기 위해
TSearchRec 사용

---- 소스코드
procedure TfrmMain.LoadFileList(Path: String);
var
    SearchRec: TSearchRec;
    ListItem: TListItem;
begin
    if Path = '' then Exit;

    FileList.Clear;
    // 여기에서는 이미지라 *.jpg, *.* 하면 모든 파일을 가져옴
    if FindFirst(Path + '*.jpg',faAnyFile,SearchRec) = 0 then begin
        repeat
            FileList.Add(SearchRec.Name);
        Until (FindNext(SearchRec) <> 0);
        FindClose(SearchRec);
    end;
end;
---- 소스코드 끝

웹페이지로 POST 전송하기
idHTTP를 사용하여 파일 목록의 파일들은 한번에 전송

---- 소스코드
var
    i : integer;
    DataStream : TidMultiPartFormDataStream;
    rs: TMemoryStream;
begin
    // 업로드
   
    ProgressBar1.Min := 0;
    ProgressBar1.Position := 0;
    ProgressBar1.Max := FileList.Count;

    for i := 0 to FileList.Count - 1 do begin
    //for i := 0 to 9 do begin

        try
            DataStream := TIdMultiPartFormDataStream.Create;
            rs := TMemoryStream.Create;

            IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401';
            idHTTP1.Request.ContentType := DataStream.RequestContentType;
            DataStream.AddFormField('title',ExtractFileName(FileList.Strings[i]));
            DataStream.AddFormField('tag','태그정보');

            // Post 로 apple_logid 와 apple_passwd 값을 전송합니다.
            DataStream.AddFile('image_file',CurPath + FileList.Strings[i],'application/octet-stream');

            // upfile 변수에 'e:\downlogo.bmp' 파일 을 추가 합니다..
            DataStream.Position := 0;
            try
              IdHTTP1.Post('파일을 받은 웹 URL',DataStream,rs);
            finally
              //ShowMessage(PChar(rs.Memory));
            end;
        finally
           DataStream.Free;
           rs.Free;
        end;

        ProgressBar1.Position := ProgressBar1.Position + 1;
        Application.ProcessMessages;
        Sleep(1000);
    end;
    ShowMessage('전송 완료');
end;
---- 소스코드 끝

POST 파일 전송 예제

Indy에 포함되어 있는 TidMultiPartFormData를 이용하여 웹페이지에
POST 파일 전송 하는 방법을 설명하겠습니다.

---- 소스코드
procedure TFmMain.Button1Click(Sender: TObject);
var
  DataStream : TidMultiPartFormDataStream;
  rs: TMemoryStream;
begin
  DataStream := TIdMultiPartFormDataStream.Create;
  rs := TMemoryStream.Create;
  try
    idHTTP1.Request.ContentType := DataStream.RequestContentType;
    DataStream.AddFormField('logid',Trim(Edit1.Text));
    DataStream.AddFormField('passwd',Trim(Edit2.Text));

    // Post 로 apple_logid 와 apple_passwd 값을 전송합니다.
    DataStream.AddFile('upfile','e:\downlogo.bmp','application/octet-stream');

    // upfile 변수에 'e:\downlogo.bmp' 파일 을 추가 합니다.. 
    DataStream.Position := 0;
    try
      IdHTTP1.Post('test.php',DataStream,rs);
    finally
      ShowMessage(PChar(rs.Memory));
    end;
  Finally
  DataStream.Free;
  end;
end;
---- 소스코드 끝

간단하게 idHTTP를 이용한 POST 전송

// 전달할 인수 설정
argv := TStringlist.Create;
argv.Add('TrustSvc='+Send_XML);

//호출
ret := IdHTTP1.Post(url, argv);


댓글

이 블로그의 인기 게시물

2025년 7월 다이어리

1. 대학교 축제 전시 프로젝트