Delphi indy 发送流到客户端
Delphi indy send stream to client
我是独立服务器的新手,所以我正在努力完成这个简单的任务。我必须创建一个服务器并上传一个小文件;它的大小总是 128 字节。然后当有人打开服务器的主页时,文件会自动发送。所以:
- 上传一个文件(128字节的文件)到磁盘
- 打开 Firefox 等浏览器
- 输入url(下面你可以看到我已经设置了127.0.0.1:798),当你按下回车键时,会出现一个白色页面,但会出现一个对话框,要求你下载文件。
到目前为止我已经写了这段代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
// IP = 127.0.0.1:798 (port is 798)
IdTCPServer1.Active := true;
Memo1.Lines.Add('Server started at: ' + TimeToStr(Now) + slinebreak);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IdTCPServer1.Active := false;
Memo1.Lines.Add('Server stopped at: ' + TimeToStr(Now));
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var a: TFileStream;
begin
a := TFileStream.Create('C:\Users\defaulr.user\Desktop\datfile.pkm', fmOpenWrite);
AContext.Connection.IOHandler.Write(a);
end;
这是表格:
开始是 Button1
,结束是 Button2
。如您所见,我正在将文件加载到流中,然后在打开页面时尝试将其作为输出发送。这是正确的做法吗?
由于您是通过网络浏览器访问该文件,因此您应该使用 TIdHTTPServer
而不是 TIdTCPServer
:
procedure TForm1.Button1Click(Sender: TObject);
begin
// IP = 127.0.0.1:798 (port is 798)
IdHTTPServer1.Active := true;
Memo1.Lines.Add('Server started at: ' + TimeToStr(Now));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IdHTTPServer1.Active := false;
Memo1.Lines.Add('Server stopped at: ' + TimeToStr(Now));
end;
// TIdHTTPServer.OnCommandGet event handler...
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
if ARequestInfo.Document = '/' then
begin
AResponseInfo.ResponseNo := 200;
AResponseInfo.ServeFile(AContext, 'C:\Users\defaulr.user\Desktop\datfile.pkm');
// alternatively:
// AResponseInfo.SmartServeFile(AContext, ARequestInfo, 'C:\Users\defaulr.user\Desktop\datfile.pkm');
end else
AResponseInfo.ResponseNo := 404;
end;
我是独立服务器的新手,所以我正在努力完成这个简单的任务。我必须创建一个服务器并上传一个小文件;它的大小总是 128 字节。然后当有人打开服务器的主页时,文件会自动发送。所以:
- 上传一个文件(128字节的文件)到磁盘
- 打开 Firefox 等浏览器
- 输入url(下面你可以看到我已经设置了127.0.0.1:798),当你按下回车键时,会出现一个白色页面,但会出现一个对话框,要求你下载文件。
到目前为止我已经写了这段代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
// IP = 127.0.0.1:798 (port is 798)
IdTCPServer1.Active := true;
Memo1.Lines.Add('Server started at: ' + TimeToStr(Now) + slinebreak);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IdTCPServer1.Active := false;
Memo1.Lines.Add('Server stopped at: ' + TimeToStr(Now));
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var a: TFileStream;
begin
a := TFileStream.Create('C:\Users\defaulr.user\Desktop\datfile.pkm', fmOpenWrite);
AContext.Connection.IOHandler.Write(a);
end;
这是表格:
开始是 Button1
,结束是 Button2
。如您所见,我正在将文件加载到流中,然后在打开页面时尝试将其作为输出发送。这是正确的做法吗?
由于您是通过网络浏览器访问该文件,因此您应该使用 TIdHTTPServer
而不是 TIdTCPServer
:
procedure TForm1.Button1Click(Sender: TObject);
begin
// IP = 127.0.0.1:798 (port is 798)
IdHTTPServer1.Active := true;
Memo1.Lines.Add('Server started at: ' + TimeToStr(Now));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IdHTTPServer1.Active := false;
Memo1.Lines.Add('Server stopped at: ' + TimeToStr(Now));
end;
// TIdHTTPServer.OnCommandGet event handler...
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
if ARequestInfo.Document = '/' then
begin
AResponseInfo.ResponseNo := 200;
AResponseInfo.ServeFile(AContext, 'C:\Users\defaulr.user\Desktop\datfile.pkm');
// alternatively:
// AResponseInfo.SmartServeFile(AContext, ARequestInfo, 'C:\Users\defaulr.user\Desktop\datfile.pkm');
end else
AResponseInfo.ResponseNo := 404;
end;