【发布时间】:2013-04-27 01:54:47
【问题描述】:
我使用 Synapse 已经有一段时间了,主要是发送电子邮件。今天我正在创建一个简单的安装程序,并尝试通过 HTTP 下载应用程序 exe 文件。该文件大小约为 9 MB,因此我想向用户添加进度状态,但我不明白我找到的示例。这是我到目前为止得到的:
type
THookSocketStatus = Procedure(Sender: TObject; Reason: THookSocketReason; const Value: String) of Object;
CallBack = class
Class Procedure Status(Sender: TObject; Reason: THookSocketReason; const Value: String);
end;
Class Procedure CallBack.Status(Sender: TObject; Reason: THookSocketReason; const Value: String);
var
V: String;
Begin
V := GetEnumName(TypeInfo(THookSocketReason), Integer(Reason)) + ' ' + Value;
Form1.mem1.Lines.Add(V);
application.ProcessMessages;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
HTTP: THTTPSend;
MSTM: TMemoryStream;
begin
Screen.Cursor := crHourGlass;
HTTP := THTTPSend.Create;
MSTM := TMemoryStream.Create;
Try
Try
HTTP.Sock.OnStatus := CallBack.Status;
If HTTP.HTTPMethod('GET', edt1.Text) Then
Begin
MSTM.Seek(0, soFromBeginning);
MSTM.CopyFrom(HTTP.Document, 0);
MSTM.SaveToFile(ExtractFilePath(Application.ExeName) + 'test.exe');
end;
Except
end;
Finally
MSTM.Free;
HTTP.Free;
Screen.Cursor := crDefault;
end;
end;
在这个简单的测试中我得到了这个结果:
HR_SocketClose
HR_ResolvingBegin www.website.com:80
HR_ResolvingEnd 176.102.295.18:80
HR_SocketCreate IPv4
HR_Connect www.website.com:80
HR_WriteCount 158
HR_CanRead
HR_ReadCount 288
HR_CanRead
HR_ReadCount 8192
HR_ReadCount 8192
HR_ReadCount 8192
HR_ReadCount 6720
HR_CanRead
HR_ReadCount 3299
.
.
.
HR_ReadCount 8192
HR_ReadCount 8192
HR_ReadCount 7828
HR_SocketClose
HR_SocketClose
请问,WriteCount 和 ReadCount 是什么意思?如何在开始下载之前获取总文件大小以设置进度条?
谢谢你们!
【问题讨论】:
-
我假设读取或写入的字节数。如果内容不是文本,您应该能够访问从 GET 请求返回的标头,并在“Content-Length: 3495”中查找“内容长度”并获取您的总文件大小。不幸的是,我从未使用过 Synapse,因此我无法提供更多指导。
-
嗨@Glenn1234,谢谢。我将尝试获取有关如何获取 GET 标头的更多信息。
-
好吧,我放弃了尝试使用 Synapse 进行此操作。我再次使用 Indy,这样做要容易得多。还是谢谢你!
标签: delphi http download synapse