首页 > 代码库 > datasnap 上传/下载大文件(本Demo以图传片文件为例)

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;

附:上面代码

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