1.因项目需要,现需将客户端中的文件上传到服务器中后才作处理,用的是RemObjects SDK.2.检看其示例(关于上传文件到服务端),运行时出现问题,因为时间紧一时间未能发现其错误修正方法.3.现将其示例中的代码贴上,望路过的友人也好,长驻的友人也好,帮个帮修正一下.代码如下:{其示例中客户端上传文件的方法}function TUploadThread.GetUploadChunk(FileMemStream: TMemoryStream; aSize:
Int64; const Sequence: Integer): Binary;
const
Block: Integer = 65536;
var
Position: Int64;
begin Result := Binary.Create;
Position := Block * (Sequence - 1);
if Position <= aSize then begin
FileMemStream.Position := Position;
if Position + Block > aSize then
Result.CopyFrom(FileMemStream, aSize - Position)
else
Result.CopyFrom(FileMemStream, Block);
end;end;procedure TUploadThread.Runupload;
var
FileMemStream: TMemoryStream;
Chunk: Binary;
Sequence: Int64;
isfirst: Boolean;
begin
fErrorText := '';
fUploadOK := false;
fChannelErrorscount := 0;
fCurrentBytePos := 0;
Sequence := 1;
fTimeStarted := Now;
FileMemStream := nil;
isfirst := true;
try if FileExists(fFilename) then try
FileMemStream := TMemoryStream.Create; FileMemStream.LoadFromFile(fFileName);
fFileName := ExtractFileName(fFileName); fFileSize := FileMemStream.Size; fInfoStr := DateTimetoStr(fTimeStarted) + ' ' +
fFileName + ' ' +
FloatToStrF(Filesize / 1024, fffixed, 15, 1) + ' KB'; if assigned(fOnStartUpload) then fOnStartUpload(Self);
Chunk := GetUploadChunk(FileMemStream, fFileSize, Sequence);
Inc(fCurrentBytePos, Chunk.Size);
Inc(Sequence);
try
fFileService.uploadChunk(isfirst, fFileName, Chunk);
FreeAndNil(Chunk);{-------------------------这里发生错误}
isfirst := false;
Chunk := GetUploadChunk(FileMemStream, fFileSize, Sequence);
while Chunk.Size > 0 do begin if Terminated then begin
if assigned(fOnAbort) then fOnAbort(Self);
exit;
end; fFileService.uploadChunk(isfirst, fFileName, Chunk); Inc(fCurrentBytePos, Chunk.Size);
FreeAndNil(Chunk);
Inc(Sequence);
if assigned(fOnProgress) then fOnProgress(Self);
Chunk := GetUploadChunk(FileMemStream, fFileSize, Sequence);
end; fUploadOK := (FileSize = 0) or (FileSize = CurrentBytePos);
finally
FreeAndNil(Chunk); end;
finally
FileMemStream.Free;
end; except
on e: Exception do begin
fErrorText := e.Message;
if assigned(fOnError) then fOnError(Self);
end;
end;
end;{服务器端接收文件内容的方法}procedure TExtendedFileTransferService.uploadchunk(const isfirst: Boolean; const filename: Widestring; const filedata: Binary);
var
NewFile: TFileStream;
localfilename: Widestring;
begin
localfilename := getFileDirectory + filename;
if isfirst and Fileexists(localfilename) then DeleteFile(localfilename);
if FileExists(localfilename) then
NewFile := TFileStream.Create(localfilename, fmOpenReadWrite)
else
NewFile := TFileStream.Create(localfilename, fmCreate);
try
NewFile.Seek(0, soFromEnd);
filedata.SaveToStream(NewFile);
finally
NewFile.Free;
end;
end;
Int64; const Sequence: Integer): Binary;
const
Block: Integer = 65536;
var
Position: Int64;
begin Result := Binary.Create;
Position := Block * (Sequence - 1);
if Position <= aSize then begin
FileMemStream.Position := Position;
if Position + Block > aSize then
Result.CopyFrom(FileMemStream, aSize - Position)
else
Result.CopyFrom(FileMemStream, Block);
end;end;procedure TUploadThread.Runupload;
var
FileMemStream: TMemoryStream;
Chunk: Binary;
Sequence: Int64;
isfirst: Boolean;
begin
fErrorText := '';
fUploadOK := false;
fChannelErrorscount := 0;
fCurrentBytePos := 0;
Sequence := 1;
fTimeStarted := Now;
FileMemStream := nil;
isfirst := true;
try if FileExists(fFilename) then try
FileMemStream := TMemoryStream.Create; FileMemStream.LoadFromFile(fFileName);
fFileName := ExtractFileName(fFileName); fFileSize := FileMemStream.Size; fInfoStr := DateTimetoStr(fTimeStarted) + ' ' +
fFileName + ' ' +
FloatToStrF(Filesize / 1024, fffixed, 15, 1) + ' KB'; if assigned(fOnStartUpload) then fOnStartUpload(Self);
Chunk := GetUploadChunk(FileMemStream, fFileSize, Sequence);
Inc(fCurrentBytePos, Chunk.Size);
Inc(Sequence);
try
fFileService.uploadChunk(isfirst, fFileName, Chunk);
FreeAndNil(Chunk);{-------------------------这里发生错误}
isfirst := false;
Chunk := GetUploadChunk(FileMemStream, fFileSize, Sequence);
while Chunk.Size > 0 do begin if Terminated then begin
if assigned(fOnAbort) then fOnAbort(Self);
exit;
end; fFileService.uploadChunk(isfirst, fFileName, Chunk); Inc(fCurrentBytePos, Chunk.Size);
FreeAndNil(Chunk);
Inc(Sequence);
if assigned(fOnProgress) then fOnProgress(Self);
Chunk := GetUploadChunk(FileMemStream, fFileSize, Sequence);
end; fUploadOK := (FileSize = 0) or (FileSize = CurrentBytePos);
finally
FreeAndNil(Chunk); end;
finally
FileMemStream.Free;
end; except
on e: Exception do begin
fErrorText := e.Message;
if assigned(fOnError) then fOnError(Self);
end;
end;
end;{服务器端接收文件内容的方法}procedure TExtendedFileTransferService.uploadchunk(const isfirst: Boolean; const filename: Widestring; const filedata: Binary);
var
NewFile: TFileStream;
localfilename: Widestring;
begin
localfilename := getFileDirectory + filename;
if isfirst and Fileexists(localfilename) then DeleteFile(localfilename);
if FileExists(localfilename) then
NewFile := TFileStream.Create(localfilename, fmOpenReadWrite)
else
NewFile := TFileStream.Create(localfilename, fmCreate);
try
NewFile.Seek(0, soFromEnd);
filedata.SaveToStream(NewFile);
finally
NewFile.Free;
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货