三层中,如何把任意文件在客户端和中间层之间互相传递? (300分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
使用临时的ClientDataSet来传输文件,方便,安全,不留垃圾,文件大小只受内存限制。
如果使用数据库中的一个表来传输也可以,只不过需要经常pack,否则会留下大量垃圾。
在远程数据模块上添加ClientDataSet1,和DataSetProvider1,
客户机上添加相应的ClientDataSet2,程序大致如下:
一.服务器部分:
1.在数据模块建立时
With ClientDataSet1do
begin
With FieldDefs.AddFieldDefdo
begin
DataType := ftString;
Size := 100;
Name := 'f_name';
end;
With FieldDefs.AddFieldDefdo
begin
DataType := ftBlob;
Name := 'f_cont';
end;
With IndexDefs.AddIndexDefdo
begin
Fields := 'f_name';
Name := 'idx';
end;
CreateDataSet;
end;
2.”Add to Inteface...“ 添加接口过程
//up_or_down=0 清除临时数据
// =1 文件上传
// =2 文件下传
procedure Txxxxx.trans_files(up_or_down: integer);
var fn: string;
begin
with ClientDataSet1do
begin
case up_or_down of
0: EmptyDataSet;
1: begin
first;
while not eofdo
begin
fn:=yourdir+FieldByName('f_name').AsString;
(FieldByName('f_cont') as TBlobField).SaveToFile(fn);
next;
end;
end;
2: begin
把文件写入ClientDataSet1中;
end;
else
begin
根据自己的定义,作点其它事情
end;
end;
end;
end;
二.客户机部分:
1.上传
with ClientDataSet2do
begin
把文件写入ClientDataSet2中;
ApplyUpdates(0);
DCOMConnection1.AppServer.trans_files(1);
end;
2.下传
with ClientDataSet2do
begin
Close;
DCOMConnection1.AppServer.trans_files(2);
Open;
把文件从ClientDataSet2中写入磁盘;
DCOMConnection1.AppServer.trans_files(0);
end;

以上代码未写数据压缩的过程,在文件进/出ClientDataSet时最好压缩/解压。
本方法在Win2k+Delphi6下运行通过,曾经互传60M的文件,一切正常。
 
use clientdataset.getrecord
 
只用Monurl中的DownLoadFile(...)就可解決問題,我就是這樣動態升級遠程客戶端.
 
楼上:????[?][?][?]
 
我是使用Ftp传递文件,
虽然比较方便,不过,也存在不好维护的问题,而且使用Ftp不如使用Socketconnection那样可以zhuo
到负载平衡和容错(这个比较好实现),我想还是使用三层比较现实一些
 
FTP比较方便,而且不容易出错。[:D]
 
特别感谢copy_paste先生,在你的基础上加以改造后TEST OK
(你提供在SERVER的FUNCTION,我水平有限,无法在TYPE LIBRARY添加,直接加上后
在CLIENT端出错,只得改用procedure,高手能否解释一下原因)
server==========:
var
p:pointer;
begin
with tfilestream.Create('oldsql1.txt',fmsharedenynone)do
try
fileto:=vararraycreate([0,size],varbyte);
p:=vararraylock(fileto);
read(p^,size)
finally
free;
vararrayunlock(fileto);
end;
client:=============
var
p:pointer;
count:integer;
myfile:olevariant;
begin
sc.AppServer.getfile(myfile);
with tfilestream.Create('c:/usbw.txt',fmcreate)do
try
p:=vararraylock(myfile);
count:=vararrayhighbound(myfile,1);
write(p^,count);
finally
free;
vararrayunlock(myfile);
end;


 
没看到错的地方。现在都不玩它了,忘光了。:)
你试一下重建一个Application试试,还有它什么错误信息?
 
to copy_paste:
你在CSDN上面的那个贴子的程序,我下载不了你可以发给我一份吗?最好有一点点说明,谢谢。
 
to wolf1860:
我很关心你是怎么把客户端的一个文件存储到远程服务器的数据库里去的,也用socketconnection连接吗?能否详细说说?
 
无法下载了阿...
mail me one copy ? cnsoft@hotmail.com
 
偶觉得还是用ftp控件比较好,毕竟ftp控件是成熟的东东,而且可以拿来直接用,提高了系统开发效率。
 
多人接受答案了。
 
后退
顶部