如何通过TIdHTTP下载大文件?

Red*_*ber 3 delphi wininet indy10 delphi-xe2

我用这段代码下载小文件:

Var
 ms:TMemoryStream;
begin
  ms:=TMemoryStream.Create;
  Idhttp1.get('http://mydomain.com/myfile.zip',ms);
  ms.SaveToFile('myfile.zip');
  ms.Free;
end;
Run Code Online (Sandbox Code Playgroud)

但是文件在存储到磁盘之前保存在RAM中,因此可能难以下载文件> 1Gb,例如.有没有办法按部件下载文件?或者我需要使用WinInet吗?提前致谢!

Rob*_*edy 12

TMemoryStream提供内存缓冲区,因此如果你下载到一个缓冲区,你需要有足够的内存来容纳你收到的所有东西.但它并不是唯一的流.您可以传递所需的Get任何类型的流,包括在收到它时将其内容写入磁盘的流.TFileStream例如,使用.

var
  s: TStream;

s := TFileStream.Create('myfile.zip', fmCreate);
try
  IdHttp1.Get(..., s);
finally
  s.Free;
end;
Run Code Online (Sandbox Code Playgroud)

任何地方,你打电话LoadFromFileSaveToFile上一个TMemoryStream,它可能是TFileStream一个更好的选择.

  • 如果`Get()`失败,我会在调用`s.Free()之后使用额外的`try/except`来删除文件.使用您显示的代码,如果下载失败,则不会删除该文件.除非您想支持恢复损坏的下载,否则不要删除该文件. (7认同)