利用DataSnap进行数据流(TStream)的传递

    技术2025-09-12  98

    DataSnap服务器可以通过方法调用向客户端返回数据流,当然,也可以从客户端向服务器上传数据流,都是通过方法调用的方式来实现的。下面以一个简单的例子来演示。

     

    服务器端实现:

     

    {$METHODINFO ON}  TFUService = class(TPersistent)  public    function ReplaceFile(FileName: string; FileStream: TStream): Integer;    function GetFile(schema, FileName: string): TStream;  end;{$METHODINFO OFF}

    //GetFile方法向客户端返回指定名称的文件数据流。ReplaceFile接收来自客户端的文件流,并替换服务器端的文件。

     

    const  BufferSize = 102400; // 100 KB

     

    implementation

     

    function TFUService.ReplaceFile(FileName: string; FileStream: TStream): Integer;var  fStream: TFilestream;  BytesReadCount: Integer;  Buffer: TBytes;begin  Result := 0;  try    if SysUtils.FileExists(FileName) then      fStream := TFilestream.Create(FileName, fmOpenWrite or fmShareDenyNone)    else fStream := TFilestream.Create(FileName, fmCreate);  except on E: Exception do    Exit(-1);  end;

      try    SetLength(Buffer, BufferSize);    fStream.Position := 0;    repeat      BytesReadCount := FileStream.Read(Buffer[0], BufferSize);      if BytesReadCount > 0 then        fStream.Write(Buffer[0], BytesReadCount);    until BytesReadCount < BufferSize;  finally    fStream.Free;  end;end;

     

    function TFUService.GetFile(FileName: string): TStream;begin  Result := nil;

      if SysUtils.FileExists(FileName) then  begin    Result := TFileStream.Create(FileName, fmOpenRead + fmShareDenyWrite);    if Result <> nil then Result.Position := 0;  end;end;//Result.Position := 0;这一句很关键,返回数据流之前,一定要定位到流的开始处。

     

    客户端代码的实现,跟上述两个方法的实现类似,只是方向相反而已。

     

    最新回复(0)