好久没写技术文了 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 := ;
//此处也可以加错误处理 或 释放默认文件 再生成流
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 = - then // 大小未知则一直读取到没有数据为止
begin
SetLength(Buffer, BufSize);
repeat
ReadCount := Stream.Read(Buffer[], BufSize);
if ReadCount > then
FS.WriteBuffer(Buffer[], ReadCount);
if ReadCount < BufSize then
break;
until ReadCount < BufSize;
end
else // 大小已知则直接复制数据
FS.CopyFrom(Stream, );
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 := ;
// memoryStream.Seek(, 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 = - then // 大小未知则一直读取到没有数据为止
begin
SetLength(Buffer, BufSize);
repeat
ReadCount := Stream.Read(Buffer[], BufSize);
if ReadCount > then
FS.WriteBuffer(Buffer[], ReadCount);
if ReadCount < BufSize then
break;
until ReadCount < BufSize;
end
else // 大小已知则直接复制数据
FS.CopyFrom(Stream, );
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;

datasnap 上传/下载大文件(本Demo以图传片文件为例)的更多相关文章

  1. B/S结构下上传下载大文件(1G以上)的解决方案

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  2. django上传下载大文件

    上传 def upFile(file): upload_dir = '/tmp/upload/%s' % username if request.method == 'POST': upload_fi ...

  3. 基础教程:上传/下载ASP.NET Core 2.0中的文件

    问题 如何上传和下载ASP.NET Core MVC中的文件. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServices( ...

  4. java附件上传下载大字段版

    public int up2(Map map) { StringBuffer insertSQL = new StringBuffer(); insertSQL.append("insert ...

  5. linux常用命令(二)文件上传下载及软件安装

    1.上传下载工具安装 (1)WINDOWS 到linux的文件上传及下载: windows下打开secureCRT,通过SSH连到⾄至远程linux主机:上传下载工具安装命令:yum -y insta ...

  6. ssm文件上传下载比较详细的案例

    背景:ssm框架 接下来,我会介绍单文件上传,下载,多文件的上传,下载,使用ajax进行文件的上传下载,和普通的表单提交的文件上传下载. 只要做项目,总是少不了文件的操作,好了废话不多说,直接上代码! ...

  7. SecureCRT 下载,安装,绝佳配色,实用配置,上传下载配置合集

    SecureCRT 下载,安装,绝佳配色,实用配置,上传下载配置合集 chocoball 发布于 2年前,共有 3 条评论 SecureCRT 是一款支持 SSH2.SSH1.Telnet.Telne ...

  8. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  9. java+大文件上传下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

随机推荐

  1. [POI2013]BAJ-Bytecomputer

    题目描述 A sequence of integers from the set is given. The bytecomputer is a device that allows the foll ...

  2. Caffe实现多标签输入,添加数据层(data layer)

    因为之前遇到了sequence learning问题(CRNN),里面涉及到一张图对应多个标签.Caffe源码本身是不支持多类标签数据的输入的. 如果之前习惯调用脚本create_imagenet.s ...

  3. 有关写log的思考

    前言 在软件开发过程中,log往往是不太引人注意的环节,大部分的log都只是开发人员为了调试bug临时加上的.这样出来的软件,最后的log往往杂乱无章没有系统性.我们判断一个软件系统的log写的好不好 ...

  4. Element UI 框架搭建

    Element UI 框架搭建 1.webpack 全局安装 npm install -g webpack 2.淘宝镜像cnpm安装 npm install -g cnpm --registry=ht ...

  5. html5适应屏幕的方案

          适应屏幕的方案: 1.css3 Media queries (针对多版本设计稿) 2.设计稿不复杂的时候 通过宽度自适应用百分比 3.通过更新meta:viewport标签,通过设计稿尺寸 ...

  6. cassandra压力测试

    http://docs.datastax.com/en/archived/cassandra/2.2/cassandra/tools/toolsCStress.html?hl=stress Simpl ...

  7. 【scala】迭代器

    如何访问集合呢?我们首先想到的是使用for循环来访问,还有一种方法是通过迭代器来访问. 在Scala中,迭代器(Iterator)不是一个集合,但是,提供了访问集合的一种方法. 迭代器包含两个基本的操 ...

  8. android 属性动画和布局动画p165-p171

    一.属性动画 ObjectAnimator ObjectAnimator是属性动画框架中最重要的实行类,创建一个ObjectAnimator只需通过他的静态工厂类直接返回一个ObjectAnimato ...

  9. MySQL index merge

    深入理解 index merge 是使用索引进行优化的重要基础之一. [ index merge]       当where谓词中存在多个条件(或者join)涉及到多个字段,它们之间进行 AND 或者 ...

  10. 谈一下思考,关于mybatis中<foreach collection="list">中list得来的原因 没看到官方说明

    <foreach> 是在sql语句中进行多个id查询 时用到的,因为mybatis代替jdbc和hibernate, 使用 在xml文件中编写sql语句,这是一个标签文件.然后在 dao层 ...