在客户端读取流应该是 Function GetSendStream(ASendStream:TStream):TMemoryStream; Var buf: array[0..131071] of byte; Index:Integer; Begin Result:=TMemoryStream.Create; repeat Index:=ASendStream.Read(buf, sizeof(buf)); if Index > 0 then Result.Write(Buf,Index); until Index=0; Result.Position:=0; End;
----------------------------------------------
就怕想不到,没有做不到的
procedure TForm_Main.Button4Click(Sender: TObject); const BufSize = $F000; var buf: Tbytes; fs: TFileStream; st: TStream; FName, SaveFileName: string; conn: TSQLConnection; DBXCommand: TDBXCommand; errcode: integer; // asize: int64; readcount: integer; s: string; begin if SaveDialog1.Execute then begin
// FName := Edit1.Text; SaveFileName := ExtractFilePath(SaveDialog1.FileName) + ExtractFileName(FName); conn := DM.GetSQLConn; try if not conn.Connected then conn.Open; fs := TFileStream.Create(SaveFileName, fmCreate, fmShareDenyWrite); DBXCommand := conn.DBXConnection.CreateCommand; try DBXCommand.CommandType := TDBXCommandTypes.DSServerMethod; DBXCommand.Text := 'TSrvMethods.DownFileMsg'; DBXCommand.Prepare; DBXCommand.Parameters[0].Value.SetWideString(FName); // Memo1.Lines.Add('开始下载文件!'); DBXCommand.ExecuteUpdate; errcode := DBXCommand.Parameters[1].Value.AsInt32; if errcode <> 0 then begin // Memo1.Lines.Add('下载失败!错误代码:' + inttostr(errcode)); exit; end; // asize := DBXCommand.Parameters[2].Value.AsInt64;
st := DBXCommand.Parameters[3].Value.GetStream(False); if st.Size = -1 then begin SetLength(buf, BufSize); repeat readcount := st.Read(buf[0], BufSize); if readcount > 0 then fs.WriteBuffer(buf[0], readcount); until readcount < BufSize; end else begin fs.CopyFrom(st, 0); end; s := DBXCommand.Parameters[4].Value.GetString; Memo_info.Lines.Add(Format('文件下载完成!' + #13#10 + '大小:%d', [fs.Size])); Memo_info.Lines.Add(s); finally DBXCommand.Free; fs.Free; st.Free; end;
function TSrvMethods.DownFileMsg(aFilePath: String; out Errcode: integer; out aSize: Int64; out outStream: TStream): string; begin result := FalseStr; try if Assigned(outStream) then outStream.Free; Errcode := 0; aSize := 0; if not FileExists(aFilePath) then begin Errcode := -1; exit; //文件不存在 end; outStream := TFileStream.Create(aFilePath, fmOpenRead, fmShareDenyWrite); try // result := fs; aSize := outStream.Size; outStream.Position := 0; result := TrueStr; finally // fs.Free; end; except on E: Exception do result := E.Message; end; end;
DataSnap的书需要仔细看啊,官方出的流的处理方式 LStream := GetServerMethodsUnitClient.QueryDataSet(ASql, AError); if AError = EmptyStr then begin if LStream <> nil then AStream := CopyStream(LStream); AStream.Position := 0; LoadFromStream(AStream, TFDStorageFormat.sfBinary);
function CopyStream(const AStream: TStream): TMemoryStream; const LBufSize = $F000; var LBuffer: TBytes; LReadLen: Integer; begin Result := nil; if AStream = nil then Exit; Result := TMemoryStream.Create; try if AStream.Size = -1 then begin SetLength(LBuffer, LBufSize); repeat LReadLen := AStream.Read(LBuffer[0], LBufSize); if LReadLen > 0 then Result.WriteBuffer(LBuffer[0], LReadLen); if LReadLen < LBufSize then break; until LReadLen < LBufSize; end else Result.CopyFrom(AStream, 0); Result.Position := 0; except Result.Free; end; end;
----------------------------------------------
-只会复制粘贴!