gpt4 book ai didi

Delphi:使用TidHTTPServer传输文件并监控单个请求的字节发送

转载 作者:行者123 更新时间:2023-12-02 09:15:34 25 4
gpt4 key购买 nike

使用 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 download 1000000 Bytes (100%)2014-11-05 16:05:00 - IPAddress 72.XXX.XXX.XXX download 500000  Bytes (50%)

最佳答案

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

例如:

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;

关于Delphi:使用TidHTTPServer传输文件并监控单个请求的字节发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26788182/

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