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

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

作者:admin 来源: 日期:2011-8-17 11:44:51 人气:737 标签:

QQ空间 新浪微博 腾讯微博 腾讯朋友 QQ收藏 百度空间 百度贴吧 更多0

好久没写技术文了 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;

附:上面代码

时间: 2024-12-27 04:19:48

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

django上传下载大文件

上传 def upFile(file): upload_dir = '/tmp/upload/%s' % username if request.method == 'POST': upload_file = request.FILES.get('file', None) if upload_file: if not os.path.exists(upload_dir): os.makedirs(upload_dir) filename = '%s/%s' % (upload_dir, uplo

java附件上传下载大字段版

public int up2(Map map) { StringBuffer insertSQL = new StringBuffer(); insertSQL.append("insert T_Sys_Attachment"); insertSQL.append("(Id,A_OwnerId,A_Size,A_Title,A_Body,Type,A_Category,A_OwnerXh"); insertSQL.append(")values(?,?,?

开源项目OkHttpPlus——支持GET、POST、UI线程回调、JSON格式解析、链式调用、文件上传下载

OkHttpPlus介绍 项目地址:https://github.com/ZhaoKaiQiang/OkHttpPlus 主要功能:OkHttp封装,支持GET.POST.UI线程回调.JSON格式解析.链式调用.小文件上传下载及进度监听等功能 为什么要写这么一个库呢? 首先,是因为OkHttp在4.4之后已经作为底层的Http实现了,所以OkHttp这个库很强大,值得我们学习. 其次,在我看来,OkHttp使用起来不如Volley方便,OkHttp的回调都是在工作线程,所以如果在回调里面操作V

ASP.NET 使用js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

在写这篇的时候本来想把标题直接写成报错的提示,如下: "SecurityError:Blocked a frame with origin "http://localhost:55080" from accessing a cross-origin frame." 但是有点长,会显示不全,就想还是换一下吧,想了一下 "ASP.NET 上传过大图片或文件报错解决办法", 然后当我写完这个题目之后,我觉得这篇文章好像根本没有写的必要,估计看完题目就会

ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

在写这篇的时候本来想把标题直接写成报错的提示,如下: “SecurityError:Blocked a frame with origin "http://localhost:55080" from accessing a cross-origin frame.” 但是有点长,会显示不全,就想还是换一下吧,想了一下 “ASP.NET 上传过大图片或文件报错解决办法”, 然后当我写完这个题目之后,我觉得这篇文章好像根本没有写的必要,估计看完题目就会想到关于web.config配置的方面了

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程: 首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯. NameNode与各DataNode使用心跳机制来获取DataNode信息.NameNode收到Client请求后,

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.

文件上传下载—servlet API实现

servlet API实现文件上传下载需要的jar包: UploadServlet.java package com.ymw.web.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID; import javax.servl

文件上传下载

1.文件上传 文件上传下载本质是通过Socket的字节流来传输数据的.所以,对于文件上传,我们可以从HttpRequest对象获取输入流,进而获取上传文件的内容.但是采用ServletAPI并不能获取获取对应文件的字节流,而是获取整个Socket的字节流,里面包括提交的参数.上传文件内容以及其他附加信息. Servlet API上传文件,代码如下 protected void doPost(HttpServletRequest request, HttpServletResponse respo