2

使用TIdHTTPServer(Indy 10.6),如何跟踪每个请求(关闭连接时)发送到客户端(用户浏览器)的字节数?

procedure onCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo;
begin
    AResponseInfo.ContentStream := TFileStream.Create('C:/HugeFile.zip', fmOpenRead or fmShareCompat);
    AResponseInfo.ContentLength := AResponseInfo.ContentStream.Size;
    AResponseInfo.WriteHeader;
    AResponseInfo.WriteContent;
    AResponseInfo.ContentStream.Free;
    AResponseInfo.ContentStream := nil;
end;

例如,在日志文件中:

2014-11-06 20:32:00 - IPAddress 84.XXX.XXX.XXX 下载 1000000 字节 (100%)
2014-11-05 16:05:00 - IPAddress 72.XXX.XXX.XXX 下载 500000 字节 (50%)
4

1 回答 1

3

如果您只想在传输结束时输出一个日志,说明发送了多少字节,您可以从中派生一个新类TFileStream并覆盖其析构函数以输出一条日志消息,显示流Position相对于其Size. 您需要记录的任何其他信息都可以传递给构造函数并保存,以便析构函数可以使用它。

例如:

type
  TMyFileStream = class(TFileStream)
  private
    FContext: TIdContext;
  public
    constructor Create(const AFileName: string; AContext: TIdContext);
    destructor Destroy; override;
  end;

constructor TMyFileStream.Create(const AFileName: string; AContext: TIdContext);
begin
  inherited Create(AFileName, fmOpenRead or fmShareCompat);
  FContext := AContext;
end;

destructor TMyFileStream.Destroy;
var
  LPos, LSize: Int64;
  LPercent: Integer;
begin
  LPos := Position;
  LSize := Size;
  if LSize <> 0 then
    LPercent := (LPosition * 100) div LSize
  else
    LPercent := 100;
  MyLogFile.WriteLine(Format('%s IPAddress %s download %d Bytes (%d%%)', [FormatDateTime('YYYY-MM-DD HH:NN:SS', Now), AContext.Binding.PeerIP, LPos, LPercent]);
  inherited;
end;

procedure onCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo;
begin
  AResponseInfo.ContentStream := TMyFileStream.Create('C:/HugeFile.zip', AContext);
end;
于 2014-11-07T18:44:42.187 回答