三层上传文件时,第一次上传正常,第二次上传客户端会报内存错误,第三次上传又正常,请帮我看看是什么原因?服务端代码:function TServerMethods1.PutFile(AfileName,SaveFolder: string; Stream: TStream): Boolean;
const             //上传
BufSize = $F000;
var
Buffer: TBytes;
ReadCount: Integer;
FS: TFileStream;
beginif not DirectoryExists(AppPath + SaveFolder) then
    CreateDir(AppPath + SaveFolder);
try
FS := TFileStream.Create(AppPath + SaveFolder + AfileName, FmCreate);
    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;
    FMan.Insertlog('客户端上传文件成功:'+AppPath+AfileName);
Except
    FMan.Insertlog('客户端上传文件失败:'+AppPath+AfileName);
    Result := False;
end;
   FreeAndNil(FS);
end;
客户端上传调用代码:Function TDtM.PutFile(faName,toName: String):Boolean;
var aSeream:TStream;
begin
  try
    aSeream:=TStream.Create;
    aSeream:=TfileStream.Create(faName,fmShareDenyNone);
    Result:=aiapp.PutFile(toName,'file\',aSeream); //这一行在第二次上传时会报内存错误。  Except
  end;
  FreeAndNil(aSeream);
end;

解决方案 »

  1.   

    我记得datasnap用stream参数的话,client端的stream是不需要释放的
      

  2.   

    function TTServer.UpLoadFile(const sFileName, sSaveFolder: WideString;
      Ole: OleVariant): WordBool;
    var S:string;
        MS: TMemoryStream;
    begin
      MS:= TMemoryStream.Create;
      MS:=OleVariantToMemoryStream(Ole);
      if not DirectoryExists(MainPath + sSaveFolder) then CreateDir(MainPath + sSaveFolder);
      try
        MS.SaveToFile(MainPath + sSaveFolder + sFileName);
        Result := True;
        OrdN:=OrdN+1;
        S:=IntToStr(OrdN)+'、'+DatetimeToStr(Now)+'客户端上传文件成功:'+MainPath+sFileName;
        ServerFrm.Memo1.Lines.Add(S);
      Except
        Result := False;
        OrdN:=OrdN+1;
        S:=IntToStr(OrdN)+'、'+DatetimeToStr(Now)+'客户端上传文件失败:'+MainPath+sFileName;
        ServerFrm.Memo1.Lines.Add(S);
      end;
      FreeAndNil(MS);
    end;
    我用D7执行成功。D7不支持stream参数,必须使用OleVariant参数。