Delphi indy向客户端发送流

时间:2017-04-26 21:38:29

标签: delphi indy indy10

我是indy服务器的新手,因此我正在努力完成这项简单的任务。我必须创建一个服务器并上传一个小文件;它的大小总是128个字节。然后当有人打开服务器的主页时,文件会自动发送。所以:

  1. 上传磁盘上的文件(128字节的文件)
  2. 打开像Firefox这样的浏览器
  3. 输入网址(下面你可以看到我设置了127.0.0.1:798),按Enter键时会出现一个白页,但会出现一个对话框,要求你下载文件。
  4. 我到目前为止编写了这段代码:

    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;
    

    这是表格:

    enter image description here

    开始时间为Button1,结束时间为Button2。正如您所看到的,我正在流中加载文件,然后在打开页面时尝试将其作为输出发送。这是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

由于您是通过网络浏览器访问该文件,因此您应该使用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;