Delphi XE2 DataSnap – 通过带有进度条的TStream下载文件

Delphi XE2 DataSnap – 通过带有进度条的TStream下载文件,第1张

概述我编写了一个DataSnap服务器方法,它返回一个TStream对象来传输文件.客户端应用程序调用该方法并正确读取流.我的问题是在TStream对象可用于读取之前,方法调用需要一段时间才能完成,但在服务器端,我可以看到方法调用只需要一秒钟来创建要返回的对象.我希望立即返回流对象,以便我可以读取流并显示下载进度的进度条.还有其他方法可以做到这一点吗? 服务器方法很简单: function TServ 我编写了一个DataSnap服务器方法,它返回一个TStream对象来传输文件.客户端应用程序调用该方法并正确读取流.我的问题是在TStream对象可用于读取之前,方法调用需要一段时间才能完成,但在服务器端,我可以看到方法调用只需要一秒钟来创建要返回的对象.我希望立即返回流对象,以便我可以读取流并显示下载进度的进度条.还有其他方法可以做到这一点吗?

服务器方法很简单:

function TServerMethods.Despatchdocument(sCompanyID,sDocOurRef: string): TStream;var  sSourcefilePath: string;  strfileStream: TfileStream;begin  sSourcefilePath := GetdocumentpdffilePath(sCompanyID,sDocOurRef);  strfileStream := TfileStream.Create(sSourcefilePath,fmOpenRead);  Result := strfileStream;end;
@R_419_6120@ 这就是我一段时间做的.我用XE并没有机会清理它.

//服务器端:

function TServerMethods1.Downloadfile(out Size: Int64): TStream;begin    Result := TfileStream.Create('upload.fil',fmOpenRead or fmShareDenyNone);    Size := Result.Size;    Result.position := 0;end;

//客户端:

procedure TfMain.Downloadfile(Sender: TObject);var    RetStream: TStream;    Buffer: PByte;    Mem: TMemoryStream;    BytesRead: Integer;    documentID: Int64;    Size: Int64;    filename: WIDeString;    BufSize: Integer;begin    BufSize := 1024;    try      Mem := TMemoryStream.Create;      GetMem( Buffer,BufSize );      try        RetStream := FDownloadDS.Downloadfile(Size);        RetStream.position := 0;        if ( Size <> 0 ) then        begin          filename := 'download.fil';          repeat            BytesRead := RetStream.Read( Pointer( Buffer )^,BufSize );            if ( BytesRead > 0 ) then            begin              Mem.WriteBuffer( Pointer( Buffer )^,BytesRead );            end;            lStatus.Caption := IntToStr( Mem.Size ) + '/' + IntToStr( Size );            Application.ProcessMessages;          until ( BytesRead < BufSize );          if ( Size <> Mem.Size ) then          begin            raise Exception.Create( 'Error downloading file...' );          end;        end        else        begin          lStatus.Caption := '';        end;      finally        FreeMem( Buffer,BufSize );        FreeAndNIl(Mem);      end;    except      on E: Exception do      begin        lErrorMessage.Caption := PChar( E.Classname + ': ' + E.Message );      end;    end;end;

您可以根据需要调整BufSize.我无法获得流的大小,直到我这样做.我尝试使用XE2并没有出现同样的问题,但我上传了.可能有更好的方法来检索流的大小.如果我很快得到答案,我会告诉你……

另一方面 – 我还没想出如何在服务器端显示进度条.我还在努力解决这个问题.

我希望这有帮助!如果您有任何疑问,请告诉我!

总结

以上是内存溢出为你收集整理的Delphi XE2 DataSnap – 通过带有进度条的TStream下载文件全部内容,希望文章能够帮你解决Delphi XE2 DataSnap – 通过带有进度条的TStream下载文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1279728.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存