【问题标题】:How can I download a huge file via TIdHTTP?如何通过 TIdHTTP 下载大文件?
【发布时间】:2013-03-01 07:06:03
【问题描述】:

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

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

但文件在存储到磁盘之前先保存在 RAM 中,因此可能难以下载大于 1Gb 的文件。有没有办法按部分下载文件?还是我需要使用 WinInet?提前致谢!

【问题讨论】:

  • 最简单的选择是只使用TFileStream 而不是TMemoryStream,它会在下载文件时直接写入磁盘。 IdHTTP.Get 只要求TStream,这意味着您可以向它提供任何类型的流。
  • 就像@Ken 所说,只需将TMemoryStream 替换为TFileStream。无论如何,不​​要忘记使用try..finally 块来保护要发布的流。您的代码最终可能会修改为something like this

标签: delphi delphi-xe2 wininet indy10


【解决方案1】:

TMemoryStream 提供了一个内存缓冲区,所以如果你下载到一个,你需要有足够的内存来保存你收到的所有东西。不过,这不是唯一的流。您可以将Get 方法传递给您想要的任何类型的流,包括在接收到它时将其内容写入磁盘的流。例如,使用TFileStream

var
  s: TStream;

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

TMemoryStream 上拨打LoadFromFileSaveToFile 的任何地方,TFileStream 可能是更好的选择。

【讨论】:

  • 谢谢,正是我需要的。
  • 如果Get() 失败,我会在调用s.Free() 后使用额外的try/except 删除文件。使用您显示的代码,如果下载失败,则不会删除该文件。除非你想支持恢复中断的下载,否则不要删除文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2022-01-10
  • 1970-01-01
  • 2015-06-16
  • 2011-09-25
  • 2019-03-27
  • 2022-09-25
相关资源
最近更新 更多