gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:49:02 27 4
gpt4 key购买 nike

我编写了一个 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;

最佳答案

我不久前就是这样做的。我用过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 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8892334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com