Delphi datasnap 上传/下载大文件(本Demo以图传片文件为例)


本文整理自网络,侵删。

 
datasnap 上传/下载大文件(本Demo以图传片文件为例)
好久没写技术文了 datasnap传大流。 完整代码,同时感谢叶兄传流的指点,(只公开十天)

服务端:

复制代码
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;


来源:https://www.cnblogs.com/china1/p/3395088.html

相关阅读 >>

Delphi 提取字符串中所有数字

Delphi 组件值实现增减

Delphi 简单的软件注册demo

Delphi 实现给字加边界代码

Delphi 7 简单语法

Delphi的字符截取函数leftstr,midstr,rightstr的介绍以及字符串拆分

Delphi实现百度地图经纬度与地址互转

Delphi循环遍历同类控件或所有控件

Delphi 内存修改的实现

Delphi中webbrowser问题集锦

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...