Welcome to Marlon's place!


Message of the day


"There is a brave man waiting, who'll take me back to where I come from"


(The Black Heart Rebellion)

How to download a file from the internet

posted: March 10, 2009

In order to be able to get the data for my little Q-Music versus Studio Brussel test, I needed a way to download the xml data from the aforementioned radio station's websites.

Downloading a small file in Delphi is relatively easy - in the following code snippet, I'll show you how this works.

First of all, here's the code: don't forget to include units SysUtils, Windows and WinInet in your program if you're going to use this snippet.

function GetFileFromURL(const location, filename : String) : boolean;
const
  BUFFER_SIZE = 1024;
var
  session : HInternet;
  url : HInternet;
  buffer : array[1..BUFFER_SIZE] of Byte;
  bufferLength : DWORD;
  f : File;
begin
  session := InternetOpen('My application', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    url := InternetOpenURL(session, PChar(location), nil, 0, INTERNET_FLAG_RELOAD, 0);
    try
      try
        AssignFile(f, filename);
        Rewrite(f);
        repeat
          InternetReadFile(url, @buffer, SizeOf(buffer), bufferLength);
          BlockWrite(f, buffer, bufferLength)
        until bufferLength = 0;
      finally
        CloseFile(f);
      end;
      result := True;
    finally
      InternetCloseHandle(url);
    end
  finally
    InternetCloseHandle(session);
  end
end;

To download a file, call the function GetFileFromURL with the location (URL) of the file, and the name of the file where you want to store the downloaded content. That's it!

Although this code works as described above, there are some additional things worth mentioning:

  • In InternetOpen you can specify the "agent" who performs the download. In this example, I used the hardcoded value of "My application", but you can of course change this to whatever string you want.
  • The INTERNET_FLAG_RELOAD flag was VERY important to me: it makes sure the download is performed each time InternetOpenURL is called, in other words it ignores caching! If you don't care about real-time, up-to-date contents, you might want to specify the value 0 instead.

Have fun downloading!

Previous articles

Recent C++ stuff

Recent Delphi stuff

Recent Java stuff