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

2024-02-27

我想通过文件流从 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 https://www.rfc-editor.org/rfc/rfc2616#section-14.35请求头),您可以只请求您想要的特定字节,这就是服务器将发送的所有字节。您可以使用TIdHTTP.Request.Range调用时的属性TIdHTTP.Get()。要发现服务器是否支持字节范围,请使用TIdHTTP.Head()首先获取URL的头部,然后检查是否有Accept-Ranges: bytes https://www.rfc-editor.org/rfc/rfc2616#section-14.5存在标头(请参阅TIdHTTP.Response.AcceptRanges财产)。

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

  • 而不是打电话fs.SaveToFile(),创建一个单独的TFileStream对象并传递TMemoryStream to its CopyFrom() http://docwiki.embarcadero.com/Libraries/en/System.Classes.TStream.CopyFrom方法,这样您就可以准确指定要保存多少字节。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过IdHTTP读取并保存部分文件流 的相关文章

  • TColorProperty德尔福柏林10.1.2?

    我正在尝试将组件从 Delphi 7 转换为 Delphi Berlin 平面组件 https sourceforge net projects flatstyle https sourceforge net projects flatst
  • Delphi 流畅的界面

    使用上有什么优点和缺点流畅的界面 http en wikipedia org wiki Fluent interface在德尔福 流畅的界面应该会增加可读性 但我对此有点怀疑one包含很多链式方法的长 LOC 是否存在编译器问题 是否存在任
  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • Delphi:现场记录应用程序错误

    使用 Delphi 7 我想知道是否有一个免费组件可以在我的应用程序在远程站点运行时收集诊断信息并帮助我调试错误报告 也许它会记录每个选择的菜单项 单击的控件 文本输入等 也许它只是在崩溃时转储堆栈 也许它还有其他作用 我不介意添加代码 例
  • Delphi Prism 中 TStringList 的替代品。

    我正在将用 Delphi 2007 Net 编写的应用程序迁移到 Delphi Prism 哪个是替换 TStringList 和 TStrings 类的最佳选择 提前致谢 Bye 只需使用 NET 框架中内置的 List 类型 或者字符串
  • D2010编译行数差异

    构建项目时 有两个地方会报告源代码行数 在编译进度对话框中 项目下 信息 在 Delphi 2007 中 对于我们正在构建的项目 这两个数字是相同的 在 Delphi 2010 中 这两个数字截然不同 1st 计数多出 100 万行或 40
  • Node.js 可读流_read用法

    我了解如何在 Node 的 new 中使用可写流Streams2库 但我不明白如何使用可读流 举个例子 一个流包装器围绕dgram module var dgram require dgram var thumbs twiddle func
  • (发件人:TObject)

    发件人 TObject 是什么意思 如 procedure TForm1 Button1Click Sender TObject var s Integer begin end Sender 是对触发事件的组件的引用 在这种情况下 Send
  • Delphi XE4 中是否可以更改应用程序短标题而不使其与项目 dpr 名称相同?

    我正在编写我的第一个由 delphi 驱动的 iPhone 应用程序 我已经创建了它 但我希望将其命名为 dpr 文件名称以外的名称 因为 dpr 文件不能包含空格 例如 EXE 名称并不总是与人们可能分配给应用程序的人类可读名称相同 而在
  • .Net StreamWriter.BaseStream,这个定义是什么意思? “获取与后备存储接口的底层流。”

    我正在读关于StreamWriter今天 偶然发现了这个楼盘 BaseStream 我正在寻找定义并发现了这个 获取与后备存储接口的底层流 从这里MSDN StreamWriter BaseStream http msdn microsof
  • Android中如何检测程序的终止?

    当 Windows 程序终止时 它会调用事件处理程序 例如 OnClose OnDestroy 和析构函数 Destroy 当我想保存一些 INI 设置时 这些地方就是我要保存的地方 我为所有这些事件编写了事件处理程序 但当我终止程序时它们
  • 通过“修改日期”确定文件夹中的哪个文件是最新的?

    我需要扫描特定文件夹中的最新文件 基本上检查修改日期以查看哪个是最新的 但请记住这些文件具有随机名称 这是我到目前为止得到的 procedure TForm1 Button1Click Sender TObject begin ftp Ho

随机推荐

  • 如何从React中的函数参数设置状态[重复]

    这个问题在这里已经有答案了 我将名称和值从子组件传递给handleChange 函数 现在我想将状态设置为与提供的名称匹配的值 但我不知道如何设置 我尝试了这种方式 但它给出了错误 this setState 不是函数 class Pare
  • MySQL 作业启动失败

    我在 Kubuntu 12 04 上 通过 apt get 安装 mysql mysql 版本 5 5 35 后 我尝试启动 mysql 服务 但出现此错误 sudo 服务 mysql 启动 开始 作业启动失败 所以我用谷歌搜索了这个问题
  • 循环分组依据、聚合并根据组创建新列

    我正在尝试获取学生专栏 根据他们的进度水平来统计活动 Data looks like STUDENT ID STUDENT ACTIVITY SESSION ID NODE NAME ACTIVITY NAME prog level Fre
  • 从 JSF 操作返回 null 和 "" 之间的区别

    据我了解 当 JSF 操作返回时 空字符串 用户停留在当前页面 但视图已刷新 然而 当动作返回时null用户仍然停留在当前页面 但旧视图被重用 我的问题是 上述说法正确 准确 吗 如果是 那么这意味着什么 具体来说 使用其中一种与另一种对页
  • Python图像库椭圆具有宽轮廓

    用PIL创建椭圆时 是否可以有更粗 更宽的轮廓 目前 我正在尝试做canvas ellipse box outline colour fill None 但希望能够给予outline参数a宽度 你可以使用aggdraw http effbo
  • 将行数组转换为列数组

    将任何 等长 行数组转换为列数组的最优雅的方法是什么 Eg 1 2 3 4 5 6 To 1 4 2 5 3 6 这是我到目前为止所拥有的 grid 1 2 3 4 5 6 grid2 for i in grid 0 grid2 push
  • Angularjs 多个 Dropzone 用于在单页上上传图像

    我使用 dropzone js 进行多图片上传 当单个页面上只有一个 dropzone 时 它 工作正常 但是 如果我尝试在单个页面上使用多个拖放区 则只有一个拖放区正在工作 即第二个拖放区 而第一个拖放区保持空闲 我试图寻找答案 但它们只
  • 传单仅呈现在一个角落

    我有一张只渲染到一个角落的传单地图 当我调整浏览器窗口大小时 整个地图都会呈现 这就是我调用地图的方式 var map L map map crs L CRS EPSG3857 setView 105 2 100 6 var tiles L
  • 印刷图片盒

    当我尝试打印PictureBox an ArgumentException被抛出 参数无效 这是打印功能 void pdGroupBox PrintPage object sender PrintPageEventArgs e foreac
  • 如何使用 sbt 跳过 javadoc 依赖项下载

    1 Javadoc 工件往往需要太多的空间和时间来下载 例如 scala library 2 10 2 sources jar是 1 Mb 但是scala library 2 10 2 javadoc jar是 34 Mb 2 大多数情况下
  • Mercurial - 同时比较多个变更集?

    为了比较我们使用 hg diff c
  • 定时器速度问题WPF

    我正在使用计时器来滚动列表 每毫秒间隔我都会启动 Tick 事件 事件虽然动画看起来很慢 repeatTimer Tick this new EventArgs repeatLeftTimer Interval TimeSpan FromM
  • 这些对象字面量有什么区别?

    我创建了两个对象 第一个正在按预期工作 let working constructor function console log working let notworking constructor console log notworki
  • 将代码拆分为多个文件时出现 LNK2019 && LNK1120 错误

    我的代码存储在main cpp文件包含void main 函数和类MyClass我现在想将其拆分为另一个文件 IDE 是 Microsoft Visual Studio 2008 Professional myclass h include
  • 如何在 OS X 静态库中包含 nib?

    我看过几篇关于 iOS 的文章讨论这个主题 但是一两次提到 OS X 只是说构建一个框架而不是静态库 我找不到有合适框架说明的帖子 我已将项目创建为静态库 并相应地对整个项目进行了编码 现在 我只想将我的框架放入演示应用程序中 但它抱怨缺少
  • java.lang.IllegalStateException:片段已添加

    我在使用目标 SDK 4 3 编译和运行的 Android 应用程序时遇到问题 该应用程序有两个 Activity 一个 MainActivity 也是启动器 Activity 和一个 SecondActivity 两者都使用 Fragme
  • 结构体末尾的空数组是C标准吗?

    我注意到在开源项目中经常使用结构末尾的空数组 typedef struct A void arr A 我想知道这是C标准吗 或者只适合 gcc 编译器 从 C99 开始 它现已成为 C 标准 C99 之前的编译器可能不支持它 旧的方法是声明
  • 为什么聚合物的 flex 属性/类不起作用?

    浏览器 Firefox v35 操作系统 Linux Ubuntu 14 Polymer v1 4 正在关注 Rob Dodson 的 Polycasts 大多数视频都提到使用 flex flexbox 来实现响应式设计 然而 我很难让它发
  • 如何使用 jQuery 将表格中的制表符顺序从水平重新分配为垂直?

    如何使用 jQuery 设置带有输入元素的表格的 Tab 键顺序 以便 Tab 键顺序为垂直 每列下方 而不是默认的水平方法 下面的数字代表我想要的跳位顺序 我希望 jQuery 代码能够独立于表中的行数和列数工作 示例表 不幸的是呈现为图
  • 通过IdHTTP读取并保存部分文件流

    我想通过文件流从 HTTP 服务器下载文件 并且只读取 并保存到文件 前几行 例如 100 行 读取前 100 行后 文件流必须结束 所以我不想下载或阅读整个文件 您可以在下面找到我到目前为止所拥有的内容 该网站只是一个例子 有人可以引导我