본문 바로가기

카테고리 없음

[네트웍/인터넷] HTTP로 파일 다운받기 (WinInet 이용)

반응형
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;
반응형