Search code examples
delphixmlhttprequest

How to get image binary data using XMLHTTPRequest in Delphi


I need to access binary image data using XMLHttpRequest in Delphi. I am using the following code but its not working, could someone please tell me what's wrong with this code, thanks in advance.

//I am using this function to get Image Binary data into Memory Stream.
procedure SendGETRequest(p_Url: string; p_resStream: TMemoryStream);
begin  
  FXmlHttpReq.open(METHOD_GET, p_Url, false, FUsername, FPassword);
  FXmlHttpReq.setRequestHeader(HTTP_AUTHENTICATION, HTTP_BASIC + EncodeBase64(
    FUsername + ':'+FPassword));
  FXmlHttpReq.setRequestHeader(HTTP_CACHE_CONTROL, HTTP_NO_CACHE);
  //FXmlHttpReq.setRequestHeader('Content-type','application/octet-stream');
  FXmlHttpReq.send('');

  if not VarIsEmpty(FXmlHttpReq.responseBody) then
  begin
   p_resStream:= OleVariantToMemoryStream(FXmlHttpReq.responseStream);
  end;//if...
end;

function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream;
var
  Data: PByteArray;
  Size: integer;
begin
  Result := TMemoryStream.Create;
  try
    Size := VarArrayHighBound (OV, 1) - VarArrayLowBound(OV, 1) + 1;
    Data := VarArrayLock(OV);
    try
      Result.Position := 0;
      Result.WriteBuffer(Data^, Size);
   finally
     VarArrayUnlock(OV);
   end;
  except
    Result.Free;
    Result := nil;
  end;
end;

Solution

  • responseStream is IStream. You need to convert it using TOleStream (AxCtrls):

    uses AxCtrls, ComObj, ActiveX;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      oXMLHTTP: OleVariant;
      MemoryStream: TMemoryStream;
      Stream: IStream;
      OleStream: TOleStream;
    begin
      oXMLHTTP := CreateOleObject('MSXML2.XMLHTTP.3.0');
      oXMLHTTP.open('GET', 'https://www.google.com/images/srpr/logo11w.png', False);
      oXMLHTTP.send(EmptyParam);
      Stream := IUnknown(oXMLHTTP.ResponseStream) as IStream;
      OleStream := TOleStream.Create(Stream);
      try
        OleStream.Position := 0;
        MemoryStream := TMemoryStream.Create;
        try
          MemoryStream.CopyFrom(OleStream, OleStream.Size);
          MemoryStream.SaveToFile('logo11w.png');
        finally
          MemoryStream.Free;
        end;
      finally
        OleStream.Free;
      end;
    end;