Downloading a file in Delphi

后端 未结 3 989
夕颜
夕颜 2020-12-14 19:54

A google search shows a few examples on how to download a file in Delphi but most are buggy and half of the time don\'t work in my experience.

I\'m looking for a si

相关标签:
3条回答
  • 2020-12-14 20:38

    Using URLMon.

    errcode := URLMon.URLDownloadToFile(nil,
                          PChar('http://www.vbforums.com/showthread.php?345726-DELPHI-Download-Files'),
    PChar( 'a:\download.htm'),
          0,
          nil);
    if errcode > 0 then
          showmessage('Error while downloading: ' + inttostr(errcode));
    
    0 讨论(0)
  • 2020-12-14 20:41

    Why not make use of indy. If you use the TIdHTTP its simple

    procedure DownloadFile;    
    var
      IdHTTP1: TIdHTTP;
      Stream: TMemoryStream;
      Url, FileName: String;
    begin    
      Url := 'http://www.rejbrand.se';
      Filename := 'download.htm';
    
      IdHTTP1 := TIdHTTP.Create(Self);
      Stream := TMemoryStream.Create;
      try
        IdHTTP1.Get(Url, Stream);
        Stream.SaveToFile(FileName);
      finally
        Stream.Free;
        IdHTTP1.Free;
      end;
    end;
    

    You can even add a progress bar by using the OnWork and OnWorkBegin Events

    procedure IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64);
    begin
      ProgressBar.Max := AWorkCountMax;
      ProgressBar.Position := 0;
    end;
    
    procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    begin
      ProgressBar.Position := AWorkCount;
    end;
    

    I'm not sure if these event fire in the context of the main thread, so any updates done to VCL components may have to be done using the tidnotify component to aviod threading issues. Maybe someone else can check that.

    0 讨论(0)
  • 2020-12-14 20:43

    The second approach is the standard way of using Internet resources using WinINet, a part of Windows API. I have used it a lot, and it has always worked well. The first approach I have never tried. (Neither is "very complicated". There will always be a few additional steps when using the Windows API.)

    If you want a very simple method, you could simply call UrlMon.URLDownloadToFile. You will not get any fine control (at all!) about the download, but it is very simple.

    Example:

    URLDownloadToFile(nil,
                      'http://www.rejbrand.se',
                      PChar(ExtractFilePath(Application.ExeName) + 'download.htm'),
                      0,
                      nil);
    
    0 讨论(0)
提交回复
热议问题