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

前端之家收集整理的这篇文章主要介绍了Delphi XE2 DataSnap – 通过带有进度条的TStream下载文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我编写了一个DataSnap服务器方法,它返回一个TStream对象来传输文件.客户端应用程序调用方法并正确读取流.我的问题是在TStream对象可用于读取之前,方法调用需要一段时间才能完成,但在服务器端,我可以看到方法调用只需要一秒钟来创建要返回的对象.我希望立即返回流对象,以便我可以读取流并显示下载进度的进度条.还有其他方法可以做到这一点吗?

服务器方法很简单:

  1. function TServerMethods.DespatchDocument(sCompanyID,sDocOurRef: string): TStream;
  2. var
  3. sSourceFilePath: string;
  4. strFileStream: TFileStream;
  5. begin
  6. sSourceFilePath := GetDocumentPDFFilePath(sCompanyID,sDocOurRef);
  7.  
  8. strFileStream := TFileStream.Create(sSourceFilePath,fmOpenRead);
  9. Result := strFileStream;
  10. end;

解决方法

这就是我一段时间做的.我用XE并没有机会清理它.

//服务器端:

  1. function TServerMethods1.DownloadFile(out Size: Int64): TStream;
  2. begin
  3. Result := TFileStream.Create('upload.fil',fmOpenRead or fmShareDenyNone);
  4. Size := Result.Size;
  5.  
  6. Result.Position := 0;
  7. end;

//客户端:

  1. procedure TfMain.DownloadFile(Sender: TObject);
  2. var
  3. RetStream: TStream;
  4. Buffer: PByte;
  5. Mem: TMemoryStream;
  6. BytesRead: Integer;
  7. DocumentId: Int64;
  8. Size: Int64;
  9. filename: WideString;
  10. BufSize: Integer;
  11. begin
  12. BufSize := 1024;
  13.  
  14. try
  15. Mem := TMemoryStream.Create;
  16. GetMem( Buffer,BufSize );
  17.  
  18. try
  19. RetStream := FDownloadDS.DownloadFile(Size);
  20. RetStream.Position := 0;
  21.  
  22. if ( Size <> 0 ) then
  23. begin
  24. filename := 'download.fil';
  25.  
  26. repeat
  27. BytesRead := RetStream.Read( Pointer( Buffer )^,BufSize );
  28.  
  29. if ( BytesRead > 0 ) then
  30. begin
  31. Mem.WriteBuffer( Pointer( Buffer )^,BytesRead );
  32. end;
  33.  
  34. lStatus.Caption := IntToStr( Mem.Size ) + '/' + IntToStr( Size );
  35. Application.ProcessMessages;
  36.  
  37. until ( BytesRead < BufSize );
  38.  
  39. if ( Size <> Mem.Size ) then
  40. begin
  41. raise Exception.Create( 'Error downloading file...' );
  42. end;
  43. end
  44. else
  45. begin
  46. lStatus.Caption := '';
  47. end;
  48. finally
  49. FreeMem( Buffer,BufSize );
  50. FreeAndNIl(Mem);
  51. end;
  52. except
  53. on E: Exception do
  54. begin
  55. lErrorMessage.Caption := PChar( E.ClassName + ': ' + E.Message );
  56. end;
  57. end;
  58. end;

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

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

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

猜你在找的Delphi相关文章