datasnap 上传/下载大文件(本Demo以图传片文件为例)
好久没写技术文了 datasnap传大流。 完整代码,同时感谢叶兄传流的指点,(只公开十天)
附:下面代码,转载请注明出处
::code
服务端:
function TServerMethods1.DownLoadFile(AfileName: string): TStream; const SaveFolder = 'FSimage\'; defaultName = 'Default.png'; // 此文件必须有 //用默认文件处理不存在图片 var ALLpath: string; begin ALLpath := LocalPath + SaveFolder + AfileName; if not FileExists(ALLpath) then ALLpath := LocalPath + SaveFolder + defaultName; Result := TFileStream.Create(ALLpath, fmOpenRead); Result.Position := 0; //此处也可以加错误处理 或 释放默认文件 再生成流 end; function TServerMethods1.PutFile(AfileName: string; Stream: TStream): Boolean; const BufSize = $F000; SaveFolder = 'FSimage\'; var Buffer: TBytes; ReadCount: Integer; FS: TFileStream; begin if not DirectoryExists(LocalPath + SaveFolder) then CreateDir(LocalPath + SaveFolder); FS := TFileStream.Create(LocalPath + SaveFolder + AfileName, FmCreate); try 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; finally FS.Free; end; end;
客户端:
procedure TForm1.Button1Click(Sender: TObject); var cs: TServerMethods1Client; memoryStream: TMemoryStream; begin cs := TServerMethods1Client.Create(self.SQLConnection1.DBXConnection); try memoryStream := TMemoryStream.Create; try // Image1.Picture.Graphic.SaveToStream(memoryStream); SaveAs(Image1.Picture.Graphic, memoryStream, gptPNG); memoryStream.Position := 0; // memoryStream.Seek(0, TSeekOrigin.soBeginning); if cs.PutFile('1.png', memoryStream) then ShowMessage('保存成功') else ShowMessage('保存失败'); finally if memoryStream <> nil then memoryStream := nil; end; finally cs.free; end; end; procedure TForm1.Button2Click(Sender: TObject); begin DownLoadfs(Image1.Picture,'1.png') end; procedure TForm1.DownLoadfs(Ggs:TPicture;fsName: string); const BufSize = $F000; var Stream, FS: TStream; cs: TServerMethods1Client; syn: TSynPicture; Buffer: TBytes; ReadCount: Integer; begin cs := TServerMethods1Client.Create(self.SQLConnection1.DBXConnection); try Stream := cs.DownLoadFile(fsName); FS := TMemoryStream.Create; try 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); syn := TSynPicture.Create; try syn.LoadFromStream(FS); Ggs.Assign(syn); finally syn.free; end; finally FS.free; end; finally cs.free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin self.SQLConnection1.Connected := True; gdip := TGDIPlusFull.Create('gdiplus.dll'); end; procedure TForm1.Image1DblClick(Sender: TObject); var syn: TSynPicture; begin if self.OpenDialog1.Execute then begin if self.OpenDialog1.FileName = '' then Exit else begin syn := TSynPicture.Create; try syn.LoadFromFile(self.OpenDialog1.FileName); self.Image1.Picture.Assign(syn); finally syn.free; end; end; end; end;