TidHttp文件下载trows内存不足异常

Raf*_*cci 4 delphi file indy download delphi-2010

考虑使用Indy组件从Internet下载文件的以下代码:

procedure TForm26.Button1Click(Sender: TObject);
var
  vFileStream : TStream;
begin
  DeleteFile('C:\test.exe');
  vFileStream := TFileStream.Create('C:\test.exe', fmCreate);
  IdHTTP1.Get('SomeUrl', vFileStream);
  vFileStream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

我得到一个Out of memory异常.发生的事情是,除了我正在使用的事实之外TFileStream,写入它的字节不会直接进入磁盘,相反,它们会一直停留在内存中直到get终止.

我试图下载的文件非常非常大.

有没有人知道如何下载一个大文件而不会出现内存不足的异常?

Delphi 2010和来自Indy SVN的最新Indy 10.

编辑

那不是FileStream问题.这是一个Indy问题.不知何故,Indy在写入流之前将文件缓存在内存中.

Rem*_*eau 5

TIdHTTP如果数据被压缩,或者数据是HTML并且TIdHTTP.HTTPOptions属性不包含hoNoParseMetaHTTPEquiv标志,则将整个文件下载到内存中.

Indy还不支持HTTP的流式解压缩(虽然它适用于FTP),因此TIdHTTP将整个压缩数据缓存到内存中,然后再将其解压缩到文件中.

解析HTML有时需要在将HTML经由HTML覆盖HTTP标头值与新的值的情况下<meta>的标签,最重要的是数据的字符集的值,因此TIdHTTP使用正确的字符集时,数据被返回到用户的代码作为可以解码数据String.启用该hoNoParseMetaHTTPEquiv标志会禁用该解析,从而禁用HTML数据的任何缓存(除非也使用压缩).

  • 为了首先处理压缩数据,您必须将`TIdZLibCompressorBase`派生的组件分配给`TIdHTTP.Compressor`属性.这反过来让`TIdHTTP`自动通知服务器支持压缩响应(除非你用`TIdHTTP.Request.AcceptEncodings`属性手动覆盖它).因此,解决方法是简单地删除/禁用Compressor,如果实际上证明是实际问题.我已经添加了Indy的问题跟踪器的门票,以支持未来版本中的流式解压缩. (2认同)