好久没写技术文了 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. 并发-ConcurrentHashMap源码分析

    ConcurrentHashMap 参考: http://www.cnblogs.com/chengxiao/p/6842045.html https://my.oschina.net/hosee/b ...

  2. js 前台ajax验证马克一下

    function check_form(){ var email=$("#email").val(); var code=$("#code").val(); v ...

  3. 数字组合问题:Combination,CombinationSum,CombinationSum2,CombinationSum3

    Combination问题描述:给定n和k,找出1-n之间所有k个数的组合,例如:n=3,k=2,返回 [[1,2]  [1,3]  [2,3]] 算法分析:利用递归.递归边界就是curr.size( ...

  4. LeetCode第[10]题(Java):Regular Expression Matching

    题目:匹配正则表达式 题目难度:hard 题目内容:Implement regular expression matching with support for '.' and '*'. '.' Ma ...

  5. 新东方雅思词汇---8.1、reckon

    新东方雅思词汇---8.1.reckon 一.总结 一句话总结:reck(注意,留心)+on 英 ['rek(ə)n]  美 ['rɛkən]  vt. 测算,估计:认为:计算 vi. 估计:计算:猜 ...

  6. yii2:不使用composer安装yii2-jui的方法

    今天有一个功能需要用到autocomplete,既然用yii2开发,在这里当然使用它自带的yii2-jui中的autocomplete组件了.yii2basic版默认是没有yii2-jui组件的,需要 ...

  7. mysql:字符分割,将字符分割成数组

    1.分割函数:SUBSTRING_INDEX('浙江温州-中国电信','-','1') 2.用例(筛选'-'前至少4个汉字的数据) a.数据分布 b.筛选sql   select t.mobile_n ...

  8. Appium 自动化测试(5)-- Appium详细介绍:Appium 手机自动化测试_TesterHome公开版pdf

  9. InnoDB存储引擎的B+树索引算法

    关于B+树数据结构 ①InnoDB存储引擎支持两种常见的索引. 一种是B+树,一种是哈希. B+树中的B代表的意思不是二叉(binary),而是平衡(balance),因为B+树最早是从平衡二叉树演化 ...

  10. Codeforces Round #394 (Div. 2) B. Dasha and friends

    B. Dasha and friends time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...