밑에 박지훈씨가 올린 것과 동일한 넘입니다..
델파이로 만들어졌다는 거 빼곤..
저역시 어디선가 주어서 사용하고 있는데..
출처는 모르겠습니다..
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;
|