Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[222] [팁/Delphi] HTTP로 파일 다운받기 (WinInet 이용)
류종택 [] 14943 읽음    2001-10-18 18:37
밑에 박지훈씨가 올린 것과 동일한 넘입니다..
델파이로 만들어졌다는 거 빼곤..
저역시 어디선가 주어서 사용하고 있는데..
출처는 모르겠습니다..


From 류..

Function  GetHttpFile(StrUrl:String; Stream:TStream):Boolean;
var
  ISession, HttpFile: HINTERNET;
  UrlBuff: String;
  ByteRead, BuffSize, FileSize, Reserved: DWord;
  bSizeIsKnown: boolean;
  ms: TMemoryStream;
  FileSizeBuff: Pointer;
  Buffer: Pointer;
begin
  Stream.Position := 0;
  Result := false;

  ISession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  HttpFile := InternetOpenUrl(ISession, PChar(StrUrl), nil, 0, INTERNET_FLAG_DONT_CACHE, 0);
  SetLength(UrlBuff, 1024);
  BuffSize := 1024;
  Reserved := 0;
  if HttpQueryInfo(HttpFile, HTTP_QUERY_CONTENT_LOCATION, PChar(UrlBuff), BuffSize, Reserved) = false then
  begin
    case(GetLastError()) of
      ERROR_INSUFFICIENT_BUFFER:
      begin
        SetLength(UrlBuff, BuffSize+1);
        HttpQueryInfo(HttpFile, HTTP_QUERY_CONTENT_LOCATION, PChar(UrlBuff), BuffSize, Reserved);
      end;
      ERROR_HTTP_HEADER_NOT_FOUND:
        UrlBuff := StrUrl;
      else
        InternetCloseHandle(HttpFile);
        exit;
    end;
  end;
  GetMem(FileSizeBuff, 4);
  BuffSize := sizeof(FileSizeBuff);
  Reserved := 0;
  bSizeIsKnown := HttpQueryInfo(HttpFile, HTTP_QUERY_CONTENT_LENGTH, FileSizeBuff, BuffSize, Reserved);
  if bSizeIsKnown then
  begin
    FileSize := StrToInt(PChar(FileSizeBuff));
    if Stream is TMemoryStream then
      ms := Stream as TMemoryStream
    else
      ms := TMemoryStream.Create;
    ms.Size := FileSize;
    Result := InternetReadFile(HttpFile, ms.Memory, FileSize, ByteRead);
    if Result then Stream.CopyFrom(ms, 0);
    if ms <> Stream then ms.Free;
  end
  else
  begin
    GetMem(Buffer, 2048);
    FileSize := 2048;
    while true do
    begin
      Result := InternetReadFile(HttpFile, Buffer, FileSize, ByteRead);
      if ByteRead = 0 then break;
      Stream.Write(Buffer^, ByteRead);
    end;
    FreeMem(Buffer);
  end;
  FreeMem(FileSizeBuff);
  InternetCloseHandle(HttpFile);
  InternetCloseHandle(ISession);
end;


+ -

관련 글 리스트
222 [팁/Delphi] HTTP로 파일 다운받기 (WinInet 이용) 류종택 14943 2001/10/18
(링크)     C++Builder Tip'N Tricks > [팁/Delphi] HTTP로 파일 다운받기 (WinInet 이용)
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.