0

我正在使用 Delphi 7 和 Indy 9 来实现一个简单的 HTTP 服务器。当我使用 POST 方法将文件上传到服务器时,我想知道 OnCommandGet 事件之前的内容长度,以便显示进度条。事件顺序如下:

  1. 在 OnPostStream 我创建一个文件流并挂钩 OnWork 事件。(这里我需要content-length来设置进度条)
  2. POST 正文被上传,OnWork 使用传输的字节触发。
  3. OnCommandGet 甚至触发,我得到了正确的内容长度的 TIdHTTPRequestInfo 对象,但此时为时已晚。

我修改了 Indy 源以获取传递给 OnPostStream 处理程序的 ASender.Data 字段中的 TIdHTTPRequestInfo 的副本。一切正常,但我不想碰印地。

有更清洁的解决方案吗?谢谢

4

1 回答 1

2

有更清洁的解决方案吗?

不适合 Indy 9,不。修改 Indy 的源代码以公开对请求对象(或至少是请求标头)的访问是唯一的选择。

在 Indy 10 中,TIdHTTPServer实际上提供了2 种方法可以Content-Length在读取 POST 数据之前获取值 - 有一个带有参数的新OnHeadersAvailable事件AHeaders,并且该OnCreatePostStream事件也有一个新AHeaders参数(因此可以使用不同的流类,具体取决于请求的类型)。您可以在任一事件中Content-Length从提供的TIdHeaderList对象中获取值,ASender.Data并根据需要存储该值以供以后使用。

但是 - 请记住,TIdHTTPServer在 Indy 10 中支持 HTTP 1.1,并且 HTTP 1.1 服务器需要允许 HTTP 1.1 客户端使用chunked传输编码发布数据。在这种情况下,将不存在Content-Length标头(或者它将为 0),因此在收到最终块之前不会知道数据长度。幸运的是,您可以查看/事件中的Transfer-Encoding标题以检测该条件并相应地调整您的进度事件。OnHeadersAvailableOnCreatePostStream

于 2015-06-24T19:22:58.320 回答