如何在Delphi中使用XMLHTTPRequest获取图像二进制数据

问题描述 投票:0回答:2

我需要在 Delphi 中使用

XMLHttpRequest
访问二进制图像数据。我正在使用以下代码,但它不起作用,有人可以告诉我这段代码有什么问题吗,提前谢谢。

//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;
delphi xmlhttprequest
2个回答
7
投票

responseStream
IStream
。您需要使用
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;

0
投票

如果 HttpReq.Status = 200 则开始 尝试 //https://stackoverflow.com/questions/4938601/getting-an-istream-from-an-olevariant strm:= getmemStreamfromIStream2(HttpReq.responsestream); //从IStream2file获取memStream(hrstream, apath); writeln('响应流大小:'+itoa(strm.size)); strm.savetoFile(apath) 打开文件(apath);
除了 writeln('EHTTPex: '+ExceptiontoString(异常类型, 异常参数)); 最后 strm.free; httpreq:= 未分配; 结束;
结束;

© www.soinside.com 2019 - 2024. All rights reserved.