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

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

附:上面代码,转载请注明出处

http://hi.baidu.com/vbz007/blog/item/68957181d2b9bbd7bc3e1e89.html

posted @ 2011-02-27 15:14  阳光不远  阅读(859)  评论(0编辑  收藏  举报