好久没写技术文了 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. nagios报错Error: No such CGI app - /usr/local/nagios/sbin/nagios/cgi-bin/status.cgi may not exist or is not executable by this process.

    加上rewrite rewrite ^/nagios/cgi-bin/(.*)\.cgi /$.cgi break;  

  2. MFC 任务管理器设计

    在学习界面设计,因为对一些控件不熟悉,所以也参考了别人的.核心代码如下. void CTasklistDlg::Expand() { m_list.SetExtendedStyle(LVS_EX_GR ...

  3. caffe2 教程入门(python版)

    学习思路 1.先看官方文档,学习如何使用python调用caffe2包,包括 Basics of Caffe2 - Workspaces, Operators, and Nets Toy Regres ...

  4. yii2:oracle date类型字段的写入或查询

    insert: insert into tabname(datecol) value(sysdate) ; -- 用date值 insert into tabname(datecol) value(s ...

  5. python 图像库PIL详解

    PIL详细文档 The most important class in the Python Imaging Library is the Image class, defined in the mo ...

  6. Codeforces Round #220 (Div. 2)

    链接 毒瘤场..... A题:,真码农题,直接干爆,枚举,注意越界问题,wa37的看这组数据1 10 1 5 2 2,应该是no //#pragma comment(linker, "/st ...

  7. 控制语句1:真假与if 语句

    一.真假与运算符 1.1 真假的划分.查看 任何数据都可以分为两类:True 与 False False : 0,None,空的数据结构例如:[] ,{},str1 = '' True  :除了上面情 ...

  8. [转载]java向word模板中填充数据(总结)

    使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...

  9. thinking java

    public class CrossContainerIteration{ public static void display(Iterator<Pet> it){ while(it.h ...

  10. canvas操作图片,进行面板画图,旋转等

    HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript). 不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用 ...