通过 IdHTTP 和 IdSSLIOHandlerSocketOpenSSL1 读取并保存部分文件流

Read and save part of file stream via IdHTTP and IdSSLIOHandlerSocketOpenSSL1

我想从 HTTPS 服务器下载文件的一部分。我使用了 Idhttp 和 IdSSLIOHandlerSocketOpenSSL 组件。使用 属性 似乎不起作用:它会下载整个文件。

如果我使用 IdHTTP1.Head() 和 IdHTTP1.Response.AcceptRanges 我什么也得不到:一个空字符串。

我做错了什么?

TIdHTTP.Response.AcceptRanges 属性 告诉您服务器是否接受给定 URL 的字节范围,在您请求 之后 URL。在请求 URL 时,您必须使用 TIdHTTP.Request.Range(s) 属性 来实际指定范围。您可以使用 TIdHTTP.Head() 检查 AcceptRanges 值,然后使用 TIdHTTP.Get() 请求实际的 URL 数据,相应地有或没有字节范围。

但是,如果 AcceptRanges 属性 在调用 TIdHTTP.Head() 后为空,那么服务器根本不支持 URL 的字节范围,所以你没有只能选择完整下载 URL 数据,然后丢弃您不想要的任何部分。您可以为此使用 TIdEventStream,或者自定义派生的 TStream class 来覆盖虚拟 TStream.Write() 方法。这两种方法都允许您忽略正在下载的数据,只需跟踪有多少字节被 "written" 到您的流,忽略字节直到达到所需的起始偏移量,然后根据需要保存剩余数据直到所需的已达到结束偏移量。