本文整理自网络,侵删。
datasnap 上传/下载大文件(本Demo以图传片文件为例)好久没写技术文了 datasnap传大流。 完整代码,同时感谢叶兄传流的指点,(只公开十天)
服务端:
复制代码function TServerMethods1.DownLoadFile(AfileName: string): TStream;constSaveFolder = 'FSimage\';defaultName = 'Default.png'; // 此文件必须有//用默认文件处理不存在图片varALLpath: string;beginALLpath := 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;constBufSize = $F000;SaveFolder = 'FSimage\';varBuffer: TBytes;ReadCount: Integer;FS: TFileStream;beginif 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);varcs: TServerMethods1Client;memoryStream: TMemoryStream;begincs := 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);beginDownLoadfs(Image1.Picture,'1.png')end; procedure TForm1.DownLoadfs(Ggs:TPicture;fsName: string);constBufSize = $F000;varStream, FS: TStream;cs: TServerMethods1Client;syn: TSynPicture;Buffer: TBytes;ReadCount: Integer;begincs := 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);beginself.SQLConnection1.Connected := True;gdip := TGDIPlusFull.Create('gdiplus.dll');end; procedure TForm1.Image1DblClick(Sender: TObject);varsyn: TSynPicture;beginif self.OpenDialog1.Execute thenbegin 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;
来源:https://www.cnblogs.com/china1/p/3395088.html
相关阅读 >>
Delphi的字符截取函数leftstr,midstr,rightstr的介绍以及字符串拆分
更多相关阅读请进入《Delphi》频道 >>