三层上传文件时,第一次上传正常,第二次上传客户端会报内存错误,第三次上传又正常,请帮我看看是什么原因?服务端代码: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;
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;
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参数。