gpt4 book ai didi

delphi - 通过IdHTTP读取并保存部分文件流

转载 作者:行者123 更新时间:2023-12-03 15:41:51 27 4
gpt4 key购买 nike

我想通过文件流从 HTTP 服务器下载文件,并且只读取(并保存到文件)前几行,例如 100 行。读取前 100 行后,文件流必须结束:所以我这样做不想下载或阅读整个文件。

您可以在下面找到我到目前为止所拥有的内容。该网站只是一个例子。有人可以引导我走向正确的方向吗?

const
myURL = https://graphical.weather.gov/xml/DWMLgen/schema/latest_DWML.txt
var
fs: TMemoryStream;
http: TIdHTTP;
begin
fs := TMemoryStream.Create;
http := TIdHTTP.Create(nil);
try
fs.Position := 0;
http.Get(myURL, fs);
fs.SaveToFile('test.xml');
finally
fs.Free;
http.free
end;
end;

最佳答案

如果 HTTP 服务器支持所需 URL 的字节范围(通过 Range 请求 header ),您可以仅请求所需的特定字节,这就是服务器将发送的全部内容。您可以在调用 TIdHTTP.Get() 时使用 TIdHTTP.Request.Range 属性。要了解服务器是否支持字节范围,请首先使用 TIdHTTP.Head() 获取 URL header ,然后检查是否有 Accept-Ranges: bytes存在 header (请参阅 TIdHTTP.Response.AcceptRanges 属性)。

如果服务器不支持字节范围,您将不得不继续使用当前的代码,只需对其进行一些更改:

  • 不要调用 fs.SaveToFile(),而是创建一个单独的 TFileStream 对象并将 TMemoryStream 传递到其 CopyFrom()方法,这样您就可以准确指定要保存多少字节。

  • 使用 TIdHTTP.OnWork 事件,或使用 TIdEventStream,或派生覆盖 Write 的自定义 TStream (),为了跟踪正在下载的字节数,以便您可以中止下载(通过引发异常,例如通过 SysUtils.Abort() 引发EAbort) )一旦收到所需的字节数。

当然,这两种方法都是面向字节而不是面向行。如果您需要面向行,特别是如果行的长度可变,那么您将必须使用上面的第二种方法,使用 TIdEventStream 或自定义 TStream,因此您可以实现行解析逻辑并仅将完整行保存到文件中,然后在收到所需行数后中止。

关于delphi - 通过IdHTTP读取并保存部分文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43939318/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com