DataSnap可以直接傳遞和返回TStream類型的參數,這點是很方便的。但是很多人發現好像大小稍微大點就工作不正常了,就變相使用其它類型轉換來轉換去,這樣便利性就失去了。
官方有篇博客很詳細的介紹了stream的使用,英文好的可以去看下DataSnap Server Method Stream Parameters
DataSnap默認的緩存大小是32k 所以如果流的大小超過這個大小就會被自動分成多個包,這就是傳遞大量數據的基礎,如果一次性發送就可能受到內存的限制。
當傳遞大量數據時獲取到的大小是-1,所以如果還是按照一般的方法來讀取流的數據就會有問題了。
下面是一個服務端代碼的示例參考,稍加修改就可以傳遞文件到服務端,由於流的數據是原始數據包發送,所以在不對數據包壓縮加密的情況下,傳遞速度是和其它方式沒有多大區別的。
// FS是一個文件流 function TMyDSServer.PutFile(Stream: TStream): Boolean; const BufSize = $F000; var Buffer: TBytes; ReadCount: Integer; begin if Stream.Size = -1 then // 大小未知則一直讀取到沒有數據為止 begin SetLength(Buffer, BufSize); repeat ReadCount := Stream.Read(Buffer[0], BufSize); if ReadCount > 0 then FS.WriteBuffer(Buffer[0], ReadCount); if ReadCount < BufSize then break; until ReadCount < BufSize; end else // 大小已知則直接復制數據 FS.CopyFrom(Stream, 0); Result := True; end;