How to retrieve a file from Internet via HTTP?

后端 未结 6 2159
天命终不由人
天命终不由人 2020-12-30 17:46

I want to download a file from Internet and InternetReadFile seem a good and easy solution at the first glance. Actually, too good to be true. Indeed, digging a bit I have s

6条回答
  •  余生分开走
    2020-12-30 18:25

    Here's some sample code that uses Indy. This code is for Delphi 2010 (with Indy 10?), but the code for Delphi 7 would be similar. I've used Indy for years with D7 and have been very happy with it. I think in D7 we use Indy 9. Check if you need to download a new version...

    You can use OnWork and OnWorkBegin to add a progress meter if you need to.

    This code I excerpted from a bigger piece, editing it a bit. I did not try compiling it, but it will give you a good starting place.

    function Download( const aSourceURL: String;
                       const aDestFileName: String;
                       out   aDownloadResult: TDownloadResult;
                       out   aErrm: String): boolean;
    var
      Stream: TMemoryStream;
      IDAntiFreeze: TIDAntiFreeze;
    begin
      aDownloadResult := DROther;
      Result := FALSE;
      fIDHTTP := TIDHTTP.Create;
      fIDHTTP.HandleRedirects := TRUE;
      fIDHTTP.AllowCookies := FALSE;
      fIDHTTP.Request.UserAgent := 'Mozilla/4.0';
      fIDHTTP.Request.Connection := 'Keep-Alive';
      fIDHTTP.Request.ProxyConnection := 'Keep-Alive';
      fIDHTTP.Request.CacheControl := 'no-cache';
      IDAntiFreeze := TIDAntiFreeze.Create;
    
      Stream := TMemoryStream.Create;
      try
        try
          fIDHTTP.Get(aSourceURL, Stream);
          if FileExists(aDestFileName) then
            DeleteFile(PWideChar(aDestFileName));
          Stream.SaveToFile(aDestFileName);
          Result := TRUE;
          aDownloadResult :=drSuccess;
        except
          On E: Exception do
            begin
              Result := FALSE;
              aErrm := E.Message + ' (' + IntToStr(fIDHTTP.ResponseCode) + ')';
            end;
        end;
      finally
        Stream.Free;
        IDAntiFreeze.Free;
        fIDHTTP.Free;
      end;
    end;  { Download }
    

提交回复
热议问题