delphi 如何通过TIdHTTP从多个服务器下载零件?

vwhgwdsa  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(218)

目前我在 Delphi 11中使用TIdHTTP来自动下载我的软件更新。我的安装程序相对较大(大约100 MB),下载需要几分钟甚至更长时间。
假设我在不同的服务器上有相同的安装文件,有没有办法使用所有这些服务器来提高下载速度,就像Torrent一样?

z9smfwbn

z9smfwbn1#

Torrent的工作原理是从多个源并行下载文件的各个部分,然后将这些部分组合成最终文件。
如果所有服务器(甚至只有一个服务器)都支持HTTP Range请求头,那么您也可以使用TIdHTTP来下载文件,例如,您可以下载字节范围为0-10231024-20472048-3071的文件,以此类推,直到最后一个块。
如果您的服务器支持此功能,则可以执行以下操作:
1.在磁盘上创建一个文件,并将其大小预设为最终文件的总大小(请参见How do you pre-allocate space for a file in C/C++ on Windows?)。

  • 对于要下载的每个文件:
  • 创建一个TIdHTTP
  • 创建一个TFileStream 1到最终文件,请求并共享读/写访问/权限,然后在文件中查找该片段所需的起始偏移量。
  • 将片段下载到TFileStream,将TIdHTTP.Request.Range属性设置为'bytes=<start>-<end>',其中start是文件中片段的起始偏移量,end是结束偏移量。

1更新:哦,等等,我忘了TIdHTTP(更具体地说,TIdIOHandler.ReadStream())将给定的TStream的大小调整为正在下载的数据的大小(如果服务器报告了该大小)(在这种情况下会发生)。当你已经预先调整了目标文件的大小时,你不希望发生这种情况,否则,如果您将多个TFileStream下载到同一个文件中,它将被截断/损坏。因此,您不能在此处使用标准的TFileStream。不过,您可以做的是,就是从TFileStream派生一个新类,然后重写它的虚拟SetSize()方法,什么都不做。我想这应该可以。
或者:

  • 对于您要下载的每个片段:
  • 创建一个TIdHTTP
  • 创建一个TFileStream(标准的TFileStream在这里是好的)到一个单独的临时文件,请求只写访问和共享没有权利,不要寻找它。
  • 将该片段下载到TFileStream,如上所述设置TIdHTTP.Request.Range
  • 下载完所有片段后,在磁盘上创建一个新文件,并将每个临时文件的字节按顺序复制到最终文件中(请参见How do I concatenate two files into one?),然后删除临时文件。

相关问题