Try this(windows only):
uses wininet;
function URLToFile(const AURL, AFileName: String): Boolean;
var
lpBuffer: array[0..1024 + 1] of Char;
lpdwNumberOfBytesRead: DWORD;
hSession: HINTERNET;
hService: HINTERNET;
fs: TFileStream;
Data: String;
begin
Result := False;
//open internet connection
hSession := InternetOpen('My application', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if hSession = nil then
begin
Exit;
end;
//open url
hService := InternetOpenUrl(hSession, PChar(AURL), nil, 0, INTERNET_FLAG_DONT_CACHE or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD, 0);
if hService = nil then
begin
InternetCloseHandle(hSession);
Exit;
end;
while (lpdwNumberOfBytesRead > 0) do
begin
// Read data from the hService handle
if not InternetReadFile(hService, @lpBuffer, 1024, lpdwNumberOfBytesRead) then
begin
InternetCloseHandle(hService);
InternetCloseHandle(hSession);
Exit;
end;
lpBuffer[lpdwNumberOfBytesRead] := #0;
Data := Data + lpBuffer;
end;
if Length(Data) > 0 then
begin
fs := TFileStream.Create(AFileName, fmCreate);
try
fs.WriteBuffer(Pointer(Data)^, Length(Data));
Result := True;
finally
fs.Free
end;
end;
end;