Save a file downloaded via WinHTTP to disk, using Delphi XE

后端 未结 1 882
闹比i
闹比i 2021-01-03 06:03

An answer to this question showed how easy it is to use WinHTTP via Type Library imports in delphi.

I imported the type library for WinHTTP, and then tried to write

相关标签:
1条回答
  • 2021-01-03 06:25

    Warren, you must use the AxCtrls.TOleStream class to comunicate the response stream with the Classes.TFileStream

    something like this

    IWinHttpRequest.ResponseStream -> TOleStream -> TFileStream
    

    Check this sample code

    {$APPTYPE CONSOLE}
    
    uses
      Variants,
      ActiveX,
      Classes,
      AxCtrls,
      WinHttp_TLB,
      SysUtils;
    
    
    function Download(const url, filename: String): Boolean;
    var
       http: IWinHttpRequest;
       wUrl: WideString;
       fs:TFileStream;
       HttpStream :IStream;
       sz,rd,wr:Int64;
       FStatus : Integer;
       OleStream: TOleStream;
    begin
      try
       wUrl := url;
       http := CoWinHttpRequest.Create;
       http.open('GET', wurl, False);
       http.send(EmptyParam);
    
       FStatus := http.status; // 200=OK!
       result := FStatus=200;
    
       if result then
       begin
        HttpStream:=IUnknown(http.ResponseStream) as IStream;
        OleStream:= TOleStream.Create(HttpStream);
        try
          fs:= TFileStream.Create(FileName, fmCreate);
          try
            OleStream.Position:= 0;
            fs.CopyFrom(OleStream, OleStream.Size);
          finally
            fs.Free;
          end;
        finally
          OleStream.Free;
        end;
       end;
    
      except
          result := false;
          // do not raise exceptions.
      end;
    end;
    
    
    begin
      try
        Download('http://foo.html','C:\Foo\anyfile.foo');
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    
    0 讨论(0)
提交回复
热议问题