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;

 

 

 

 

转载于:https://www.cnblogs.com/china1/p/3395088.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值