Downloading a file in delphi from a trigger and capturing the file name

delphi, http

Solution

to get the filename from a url you can retrieve the HEAD information and check Content Disposition header field. For this task you can use the TIdHTTP indy component. if the Content Disposition doesn't have the file name you can try parsing the url.

Try this sample .

{$APPTYPE CONSOLE}

{$R *.res}

uses
  IdURI,
  IdHttp,
  SysUtils;

function GetRemoteFileName (const URI: string) : string;
var
  LHttp: TIdHTTP;
begin
  LHttp := TIdHTTP.Create(nil);
  try
    LHttp.Head(URI);
    Result:= LHTTP.Response.RawHeaders.Params['Content-Disposition', 'filename'];
    if Result = '' then
     with TIdURI.Create(URI) do
      try
       Result := Document;
      finally
       Free;
      end;
  finally
    LHttp.Free;
  end;
end;

begin
  try
    Writeln(GetRemoteFileName('http://dl.dropbox.com/u/12733424/Blog/Delphi%20Wmi%20Code%20Creator/Setup_WmiDelphiCodeCreator.exe'));
    Writeln(GetRemoteFileName('http://studiostyl.es/settings/downloadScheme/1305'));

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Problem

I have a url of a website. It looks something like this: http://www.example.com/downloads/file/4789/download? I would like to save the file to my system, but I do not know how to get the file name of the download triggered by the URL in my example. Some files are pdf others are doc and rtf etc. If someone can please point me in a direction of the filename problem and also what components to use, I would really appreciate it.

Original source